From 4618b7a398d67c24174031e3d2589ec6365f6125 Mon Sep 17 00:00:00 2001 From: XuanRui LI Date: Thu, 28 May 2026 13:11:27 +0800 Subject: [PATCH 01/29] Add B&H Photo WebHarbor mirror --- .claude/skills/clone-website/SKILL.md | 4 +- .claude/skills/evolve-env/SKILL.md | 6 +- .claude/skills/harden-env/SKILL.md | 2 +- .claude/skills/review-env/SKILL.md | 8 +- .claude/skills/seed-database/SKILL.md | 6 +- .gitignore | 8 +- AGENTS.md | 12 +- CONTRIBUTING.md | 4 +- Dockerfile | 6 +- README.md | 8 +- control_server.py | 2 +- sites/bh_photo/_health.py | 4 + sites/bh_photo/app.py | 1405 +++++++++++++++ sites/bh_photo/requirements.txt | 4 + sites/bh_photo/seed_data.py | 1575 +++++++++++++++++ sites/bh_photo/static/css/main.css | 1133 ++++++++++++ sites/bh_photo/static/js/main.js | 7 + sites/bh_photo/tasks.jsonl | 20 + sites/bh_photo/templates/_product_card.html | 38 + sites/bh_photo/templates/account.html | 44 + sites/bh_photo/templates/account_edit.html | 38 + sites/bh_photo/templates/addresses.html | 20 + sites/bh_photo/templates/base.html | 99 ++ sites/bh_photo/templates/bundles.html | 36 + sites/bh_photo/templates/cart.html | 47 + sites/bh_photo/templates/categories.html | 27 + .../bh_photo/templates/category_listing.html | 148 ++ sites/bh_photo/templates/checkout.html | 53 + sites/bh_photo/templates/compare.html | 50 + sites/bh_photo/templates/contact.html | 31 + sites/bh_photo/templates/help.html | 30 + sites/bh_photo/templates/index.html | 159 ++ sites/bh_photo/templates/login.html | 22 + sites/bh_photo/templates/order_receipt.html | 33 + sites/bh_photo/templates/orders.html | 37 + sites/bh_photo/templates/product_detail.html | 177 ++ sites/bh_photo/templates/register.html | 49 + sites/bh_photo/templates/store_pickup.html | 70 + sites/bh_photo/templates/wishlist.html | 19 + websyn_start.sh | 12 +- 40 files changed, 5415 insertions(+), 38 deletions(-) create mode 100644 sites/bh_photo/_health.py create mode 100644 sites/bh_photo/app.py create mode 100644 sites/bh_photo/requirements.txt create mode 100644 sites/bh_photo/seed_data.py create mode 100644 sites/bh_photo/static/css/main.css create mode 100644 sites/bh_photo/static/js/main.js create mode 100644 sites/bh_photo/tasks.jsonl create mode 100644 sites/bh_photo/templates/_product_card.html create mode 100644 sites/bh_photo/templates/account.html create mode 100644 sites/bh_photo/templates/account_edit.html create mode 100644 sites/bh_photo/templates/addresses.html create mode 100644 sites/bh_photo/templates/base.html create mode 100644 sites/bh_photo/templates/bundles.html create mode 100644 sites/bh_photo/templates/cart.html create mode 100644 sites/bh_photo/templates/categories.html create mode 100644 sites/bh_photo/templates/category_listing.html create mode 100644 sites/bh_photo/templates/checkout.html create mode 100644 sites/bh_photo/templates/compare.html create mode 100644 sites/bh_photo/templates/contact.html create mode 100644 sites/bh_photo/templates/help.html create mode 100644 sites/bh_photo/templates/index.html create mode 100644 sites/bh_photo/templates/login.html create mode 100644 sites/bh_photo/templates/order_receipt.html create mode 100644 sites/bh_photo/templates/orders.html create mode 100644 sites/bh_photo/templates/product_detail.html create mode 100644 sites/bh_photo/templates/register.html create mode 100644 sites/bh_photo/templates/store_pickup.html create mode 100644 sites/bh_photo/templates/wishlist.html diff --git a/.claude/skills/clone-website/SKILL.md b/.claude/skills/clone-website/SKILL.md index de4ba4616..ee92c57aa 100644 --- a/.claude/skills/clone-website/SKILL.md +++ b/.claude/skills/clone-website/SKILL.md @@ -204,7 +204,7 @@ Then run the site once locally to produce `instance/.db`, copy it to ```bash ./scripts/build.sh webharbor:dev docker run -d --rm --name wh-test \ - -p 8201:8101 -p 41000-41014:40000-40014 webharbor:dev + -p 8201:8101 -p 41000-41015:40000-40015 webharbor:dev # your new site is on port 41000 + its index curl -so /dev/null -w "%{http_code}\n" http://localhost:41000NN/ @@ -228,7 +228,7 @@ After Phase 1, you should have: - `sites//static/` with real CSS/JS/icons (and images under HF assets) - `sites//instance_seed/.db` with seeded data - Site registered in `websyn_start.sh`, `control_server.py`, `Dockerfile` -- All 15 sites still return 200 on the alt-port container +- All registered sites still return 200 on the alt-port container - Byte-identical reset passes ## Next step diff --git a/.claude/skills/evolve-env/SKILL.md b/.claude/skills/evolve-env/SKILL.md index 091465c4d..a9a5a6bb7 100644 --- a/.claude/skills/evolve-env/SKILL.md +++ b/.claude/skills/evolve-env/SKILL.md @@ -65,7 +65,7 @@ through `BASE_DIR = os.path.dirname(os.path.abspath(__file__))`. After any DB-affecting change: ```bash -# 1. Stop test container (don't touch user's working container on :40000-40014) +# 1. Stop test container (don't touch user's working container on :40000-40015) docker stop wh-test 2>/dev/null || true # 2. Rebuild @@ -73,7 +73,7 @@ docker stop wh-test 2>/dev/null || true # 3. Run on alt ports docker run -d --rm --name wh-test \ - -p 8201:8101 -p 41000-41014:40000-40014 webharbor:dev + -p 8201:8101 -p 41000-41015:40000-40015 webharbor:dev # 4. Reset your site and confirm byte-identity curl -X POST http://localhost:8201/reset/ @@ -149,7 +149,7 @@ After Phase 3: - Every task in `tasks.jsonl` is hand-verified to work end-to-end - The mirror has no obvious leaks, broken forms, or empty pages - Byte-identical reset passes -- All 15 sites still return 200 +- All registered sites still return 200 ## Next step diff --git a/.claude/skills/harden-env/SKILL.md b/.claude/skills/harden-env/SKILL.md index 8d2e1b639..199fd57cc 100644 --- a/.claude/skills/harden-env/SKILL.md +++ b/.claude/skills/harden-env/SKILL.md @@ -130,7 +130,7 @@ Hardening changes seed data. After any DB change: ```bash ./scripts/build.sh webharbor:dev docker run -d --rm --name wh-test \ - -p 8201:8101 -p 41000-41014:40000-40014 webharbor:dev + -p 8201:8101 -p 41000-41015:40000-40015 webharbor:dev curl -X POST http://localhost:8201/reset/ docker exec wh-test md5sum \ /opt/WebSyn//instance/.db \ diff --git a/.claude/skills/review-env/SKILL.md b/.claude/skills/review-env/SKILL.md index 6542aeb1a..c916bc352 100644 --- a/.claude/skills/review-env/SKILL.md +++ b/.claude/skills/review-env/SKILL.md @@ -26,7 +26,7 @@ gh pr checkout ./scripts/fetch_assets.sh # pull the pinned HF revision ./scripts/build.sh webharbor:dev docker run -d --rm --name wh-review \ - -p 8201:8101 -p 41000-41014:40000-40014 webharbor:dev + -p 8201:8101 -p 41000-41015:40000-40015 webharbor:dev ``` Confirm the new/changed site is on the expected port (40000 + index). @@ -36,8 +36,8 @@ Confirm the new/changed site is on the expected port (40000 + index). Run the same Pre-PR checks the contributor was supposed to run. ```bash -# 1. all 15 sites return 200 -for p in $(seq 41000 41014); do +# 1. all registered sites return 200 +for p in $(seq 41000 41015); do curl -so /dev/null -w "$p:%{http_code}\n" http://localhost:$p/ done @@ -181,7 +181,7 @@ Leave a structured comment on the PR: ## Review: ### Mechanical checks: PASS / FAIL -- [x] All 15 sites return 200 +- [x] All registered sites return 200 - [x] Control plane healthy - [x] Byte-identical reset (md5 match) - [x] Parallel reset <10s diff --git a/.claude/skills/seed-database/SKILL.md b/.claude/skills/seed-database/SKILL.md index 8f0b61e8d..f59da45d3 100644 --- a/.claude/skills/seed-database/SKILL.md +++ b/.claude/skills/seed-database/SKILL.md @@ -169,10 +169,10 @@ gh pr create ./scripts/check_assets.sh # every site has instance_seed/ ./scripts/build.sh webharbor:dev # docker build succeeds docker run -d --rm --name wh-test \ - -p 8201:8101 -p 41000-41014:40000-40014 webharbor:dev + -p 8201:8101 -p 41000-41015:40000-40015 webharbor:dev -# all 15 sites return 200 -for p in $(seq 41000 41014); do +# all registered sites return 200 +for p in $(seq 41000 41015); do curl -so /dev/null -w "$p:%{http_code}\n" http://localhost:$p/ done diff --git a/.gitignore b/.gitignore index c2efc04c1..e78992328 100644 --- a/.gitignore +++ b/.gitignore @@ -9,8 +9,10 @@ sites/*/static/external_cache/ # ============================================================= # Intermediate / volatile — never committed anywhere. # ============================================================= -sites/*/scraped_data/ # scrape pipeline intermediate; runtime data lives in instance_seed/*.db -sites/*/instance/ # rebuilt at every container boot from instance_seed/ +# scrape pipeline intermediate; runtime data lives in instance_seed/*.db +sites/*/scraped_data/ +# rebuilt at every container boot from instance_seed/ +sites/*/instance/ sites/*/venv/ # HF download metadata produced by `hf download`. @@ -92,4 +94,4 @@ secrets.json # ============================================================ # Agent demo results # ============================================================= -agent_demo/runs/ \ No newline at end of file +agent_demo/runs/ diff --git a/AGENTS.md b/AGENTS.md index 8b24944f6..f80abe186 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,7 +4,7 @@ A coding agent (Claude Code, Cursor, Aider, Codex, ...) is reading this. Read on ## What it is -15 Flask mirror websites (Amazon, GitHub, BBC News, ...) packaged into one Docker image, plus a control plane on `:8101` for resetting per-site state. Used as a deterministic offline environment for web-agent benchmarks. ~3 GB image. +16 Flask mirror websites (Amazon, GitHub, BBC News, ...) packaged into one Docker image, plus a control plane on `:8101` for resetting per-site state. Used as a deterministic offline environment for web-agent benchmarks. ~3 GB image. Two repos: - **code** (this one) — Flask apps, control plane, scripts. @@ -48,17 +48,17 @@ Inside the image, sites live at `/opt/WebSyn//`. The path predates the ren # fresh clone ./scripts/fetch_assets.sh # pulls assets from HF ./scripts/build.sh # docker build -t webharbor:dev . -docker run -d -p 8101:8101 -p 40000-40014:40000-40014 webharbor:dev +docker run -d -p 8101:8101 -p 40000-40015:40000-40015 webharbor:dev ``` Or use the published image directly: ```bash -docker run -d -p 8101:8101 -p 40000-40014:40000-40014 \ +docker run -d -p 8101:8101 -p 40000-40015:40000-40015 \ battalion7244/webharbor:latest ``` -Sites are on `40000`-`40014` in the order declared by `SITES=( ... )` in `websyn_start.sh`. Control plane: +Sites are on `40000`-`40015` in the order declared by `SITES=( ... )` in `websyn_start.sh`. Control plane: | Method | Path | Purpose | |--------|---------------------|-------------------------------------------| @@ -129,13 +129,13 @@ python3 -m py_compile sites//app.py # 3. run on alt ports (don't collide with anything you already have running) docker run -d --rm --name wh-test \ - -p 8201:8101 -p 41000-41014:40000-40014 webharbor:dev + -p 8201:8101 -p 41000-41015:40000-40015 webharbor:dev # 4. control plane healthy, all sites alive curl -s http://localhost:8201/health | python3 -m json.tool | head # 5. every site renders 200 -for p in $(seq 41000 41014); do +for p in $(seq 41000 41015); do curl -so /dev/null -w "$p:%{http_code}\n" http://localhost:$p/ done diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 17c6a0607..cdc451252 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,7 +15,7 @@ git clone https://github.com//webharbor && cd webharbor ./scripts/fetch_assets.sh # pull current assets ./scripts/new_site.py mywebsite # OR edit an existing site ./scripts/build.sh && docker run -d --rm \ - -p 8101:8101 -p 40000-40014:40000-40014 webharbor:dev + -p 8101:8101 -p 40000-40015:40000-40015 webharbor:dev # iterate locally... ./scripts/extract_assets.sh ../webharbor-static-pr/ # split assets out @@ -186,4 +186,4 @@ Sites must not import from one another. The image launches each as an independen ### Don't hard-code secrets -Each site sets `SECRET_KEY` to a deterministic dev value. Acceptable for a benchmark image (resets blow away sessions anyway). If a contrib ever needs real secrets, raise it in an issue first. \ No newline at end of file +Each site sets `SECRET_KEY` to a deterministic dev value. Acceptable for a benchmark image (resets blow away sessions anyway). If a contrib ever needs real secrets, raise it in an issue first. diff --git a/Dockerfile b/Dockerfile index 991e5ab60..8086dfc2e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -# WebHarbor — slim, self-contained image. -# 15 Flask mirror sites + control plane on :8101. +# WebHarbor - slim, self-contained image. +# 16 Flask mirror sites + control plane on :8101. FROM python:3.12-slim-bookworm @@ -33,6 +33,6 @@ COPY control_server.py /opt/control_server.py COPY site_runner.py /opt/site_runner.py RUN chmod +x /opt/websyn_start.sh -EXPOSE 8101 40000-40014 +EXPOSE 8101 40000-40015 CMD ["/opt/websyn_start.sh"] diff --git a/README.md b/README.md index dce3f934f..f2cb0e46c 100644 --- a/README.md +++ b/README.md @@ -36,17 +36,17 @@ WebHarbor takes a different approach. We leverage coding agent (e.g., Claude Cod - **Deep features unlocked** — carts, checkouts, accounts, all fully testable - **Evolving** — harder tasks drive richer mirrors; the environment grows with agents - **RL-ready** — sub-second database resets between rollouts -- **Community-driven** — 15 sites today, scaling to 100+ together +- **Community-driven** — 16 sites today, scaling to 100+ together ## 🚀 Quickstart One command to run all web environments: ```bash -docker run -p 8101:8101 -p 40000-40014:40000-40014 battalion7244/webharbor:latest +docker run -p 8101:8101 -p 40000-40015:40000-40015 battalion7244/webharbor:latest ``` -Then point your agent at `http://localhost:40000` through `http://localhost:40014` to explore 15 local mirrors of webvoyager sites: `Allrecipes, Amazon, Apple, ArXiv, BBC News, Booking, GitHub, Google Flights, Google Maps, Google Search, Hugging Face, Wolfram Alpha, Cambridge Dictionary, Coursera, and ESPN`. +Then point your agent at `http://localhost:40000` through `http://localhost:40015` to explore 16 local mirrors of webvoyager sites: `Allrecipes, Amazon, Apple, ArXiv, BBC News, Booking, GitHub, Google Flights, Google Maps, Google Search, Hugging Face, Wolfram Alpha, Cambridge Dictionary, Coursera, ESPN, and B&H Photo`. For sub-second reset between rollouts, expose the control plane and call `/reset/`: @@ -111,4 +111,4 @@ WebHarbor is initiated by UNC-Chapel Hill and Microsoft, with contributions from url = {https://aiming-lab.github.io/webharbor.github.io}, note = {Project website.} } -``` \ No newline at end of file +``` diff --git a/control_server.py b/control_server.py index c255253c6..8d0252857 100644 --- a/control_server.py +++ b/control_server.py @@ -26,7 +26,7 @@ 'allrecipes', 'amazon', 'apple', 'arxiv', 'bbc_news', 'booking', 'github', 'google_flights', 'google_map', 'google_search', 'huggingface', 'wolfram_alpha', 'cambridge_dictionary', - 'coursera', 'espn', + 'coursera', 'espn', 'bh_photo', ] BASE_PORT = 40000 WEBSYN_DIR = '/opt/WebSyn' diff --git a/sites/bh_photo/_health.py b/sites/bh_photo/_health.py new file mode 100644 index 000000000..e2977e2c6 --- /dev/null +++ b/sites/bh_photo/_health.py @@ -0,0 +1,4 @@ +"""Per-site health probe (optional, called by control_server).""" +def health(): + return {"ok": True, "site": "bh_photo"} + diff --git a/sites/bh_photo/app.py b/sites/bh_photo/app.py new file mode 100644 index 000000000..c953b1bbf --- /dev/null +++ b/sites/bh_photo/app.py @@ -0,0 +1,1405 @@ +import os +import re +from collections import defaultdict +from datetime import datetime + +from flask import ( + Flask, + abort, + flash, + redirect, + render_template, + request, + session, + url_for, +) +from flask_bcrypt import Bcrypt +from flask_login import ( + LoginManager, + UserMixin, + current_user, + login_required, + login_user, + logout_user, +) +from flask_sqlalchemy import SQLAlchemy + + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +INSTANCE_DIR = os.path.join(BASE_DIR, "instance") +SITE_DB = os.path.join(INSTANCE_DIR, "bh_photo.db") +os.makedirs(INSTANCE_DIR, exist_ok=True) + +app = Flask(__name__, instance_path=INSTANCE_DIR) +app.config["SECRET_KEY"] = "webharbor-bh-photo-demo-key" +app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{SITE_DB}" +app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False + +db = SQLAlchemy(app) +bcrypt = Bcrypt(app) +login_manager = LoginManager(app) +login_manager.login_view = "login" +login_manager.login_message = "Please sign in to access saved shopping tools." +login_manager.login_message_category = "info" + +STOP_WORDS = { + "the", + "a", + "an", + "for", + "to", + "of", + "and", + "or", + "in", + "on", + "with", + "by", + "from", + "new", +} + + +class User(db.Model, UserMixin): + __tablename__ = "users" + + id = db.Column(db.Integer, primary_key=True) + email = db.Column(db.String(140), unique=True, nullable=False, index=True) + username = db.Column(db.String(80), unique=True, nullable=False, index=True) + password_hash = db.Column(db.String(255), nullable=False) + display_name = db.Column(db.String(120), nullable=False) + phone = db.Column(db.String(40), default="") + company = db.Column(db.String(120), default="") + role = db.Column(db.String(80), default="Creator") + preferred_store_id = db.Column(db.Integer, db.ForeignKey("store_locations.id")) + newsletter_opt_in = db.Column(db.Boolean, default=True) + sms_opt_in = db.Column(db.Boolean, default=False) + created_at = db.Column(db.DateTime, default=datetime.utcnow) + + addresses = db.relationship("Address", backref="user", lazy=True, cascade="all, delete-orphan") + cart_items = db.relationship("CartItem", backref="user", lazy=True, cascade="all, delete-orphan") + wishlist_items = db.relationship("WishlistItem", backref="user", lazy=True, cascade="all, delete-orphan") + compare_items = db.relationship("CompareItem", backref="user", lazy=True, cascade="all, delete-orphan") + orders = db.relationship("Order", backref="user", lazy=True, cascade="all, delete-orphan") + reservations = db.relationship("StoreReservation", backref="user", lazy=True, cascade="all, delete-orphan") + search_logs = db.relationship("SearchLog", backref="user", lazy=True, cascade="all, delete-orphan") + + def set_password(self, password: str) -> None: + self.password_hash = bcrypt.generate_password_hash(password).decode("utf-8") + + def check_password(self, password: str) -> bool: + return bcrypt.check_password_hash(self.password_hash, password) + + +class Address(db.Model): + __tablename__ = "addresses" + + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False) + label = db.Column(db.String(40), default="Studio") + recipient = db.Column(db.String(120), nullable=False) + line1 = db.Column(db.String(200), nullable=False) + line2 = db.Column(db.String(200), default="") + city = db.Column(db.String(80), nullable=False) + state = db.Column(db.String(40), nullable=False) + zip_code = db.Column(db.String(20), nullable=False) + country = db.Column(db.String(60), default="United States") + phone = db.Column(db.String(40), default="") + is_default = db.Column(db.Boolean, default=False) + + +class Category(db.Model): + __tablename__ = "categories" + + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(120), nullable=False) + slug = db.Column(db.String(120), unique=True, nullable=False, index=True) + description = db.Column(db.Text, default="") + hero_copy = db.Column(db.Text, default="") + icon_label = db.Column(db.String(32), default="") + nav_order = db.Column(db.Integer, default=0) + parent_id = db.Column(db.Integer, db.ForeignKey("categories.id")) + + parent = db.relationship("Category", remote_side=[id], backref="children") + products = db.relationship("Product", backref="category", lazy=True) + + +class Brand(db.Model): + __tablename__ = "brands" + + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(120), unique=True, nullable=False) + slug = db.Column(db.String(120), unique=True, nullable=False, index=True) + blurb = db.Column(db.Text, default="") + origin = db.Column(db.String(80), default="") + badge_color = db.Column(db.String(16), default="#24423f") + + products = db.relationship("Product", backref="brand", lazy=True) + + +class Product(db.Model): + __tablename__ = "products" + + id = db.Column(db.Integer, primary_key=True) + category_id = db.Column(db.Integer, db.ForeignKey("categories.id"), nullable=False) + brand_id = db.Column(db.Integer, db.ForeignKey("brands.id"), nullable=False) + name = db.Column(db.String(200), nullable=False) + slug = db.Column(db.String(220), unique=True, nullable=False, index=True) + sku = db.Column(db.String(32), unique=True, nullable=False) + short_description = db.Column(db.String(220), default="") + description = db.Column(db.Text, default="") + search_blob = db.Column(db.Text, default="") + price = db.Column(db.Float, nullable=False) + list_price = db.Column(db.Float, default=0) + rating = db.Column(db.Float, default=4.5) + review_count = db.Column(db.Integer, default=0) + qa_count = db.Column(db.Integer, default=0) + condition = db.Column(db.String(40), default="New") + availability = db.Column(db.String(40), default="In Stock") + stock_level = db.Column(db.Integer, default=0) + pickup_available = db.Column(db.Boolean, default=True) + pickup_message = db.Column(db.String(120), default="") + shipping_message = db.Column(db.String(120), default="") + return_window = db.Column(db.String(80), default="30-Day Return Window") + warranty = db.Column(db.String(120), default="1-Year Demo Warranty") + best_seller_rank = db.Column(db.Integer, default=999) + sort_newness = db.Column(db.Integer, default=0) + top_category_slug = db.Column(db.String(80), default="") + subcategory_slug = db.Column(db.String(80), default="") + product_family = db.Column(db.String(80), default="") + product_type = db.Column(db.String(80), default="") + sensor_size = db.Column(db.String(80), default="") + mount_type = db.Column(db.String(80), default="") + focal_length = db.Column(db.String(80), default="") + focal_length_bucket = db.Column(db.String(40), default="") + megapixels = db.Column(db.Float, default=0) + capacity_gb = db.Column(db.Integer, default=0) + connectivity = db.Column(db.String(120), default="") + pickup_store_count = db.Column(db.Integer, default=0) + image_path = db.Column(db.String(220), default="") + accent_color = db.Column(db.String(16), default="#24504d") + release_label = db.Column(db.String(60), default="") + is_featured = db.Column(db.Boolean, default=False) + is_bundle_anchor = db.Column(db.Boolean, default=False) + is_used_highlight = db.Column(db.Boolean, default=False) + + images = db.relationship("ProductImage", backref="product", lazy=True, cascade="all, delete-orphan") + spec_groups = db.relationship("ProductSpecGroup", backref="product", lazy=True, cascade="all, delete-orphan") + variants = db.relationship("ProductVariant", backref="product", lazy=True, cascade="all, delete-orphan") + reviews = db.relationship("ProductReview", backref="product", lazy=True, cascade="all, delete-orphan") + questions = db.relationship("ProductQuestion", backref="product", lazy=True, cascade="all, delete-orphan") + store_inventory = db.relationship("StoreInventory", backref="product", lazy=True, cascade="all, delete-orphan") + deals = db.relationship("Deal", backref="product", lazy=True, cascade="all, delete-orphan") + + def active_deal(self): + return next((deal for deal in self.deals if deal.is_active), None) + + @property + def display_price(self) -> float: + deal = self.active_deal() + return deal.sale_price if deal else self.price + + @property + def savings_amount(self) -> float: + return max((self.list_price or self.price) - self.display_price, 0) + + @property + def savings_percent(self) -> int: + base = self.list_price or self.price + if not base or self.display_price >= base: + return 0 + return int(round((base - self.display_price) / base * 100)) + + @property + def main_image(self) -> str: + if self.image_path: + return self.image_path + if self.images: + return self.images[0].path + return "images/bh-photo-fallback.svg" + + @property + def top_spec_map(self) -> dict: + spec_map = {} + for group in self.spec_groups: + for spec in group.specs: + spec_map[spec.name] = spec.value + return spec_map + + @property + def average_review_label(self) -> str: + return f"{self.rating:.1f}" + + +class ProductImage(db.Model): + __tablename__ = "product_images" + + id = db.Column(db.Integer, primary_key=True) + product_id = db.Column(db.Integer, db.ForeignKey("products.id"), nullable=False) + path = db.Column(db.String(220), nullable=False) + label = db.Column(db.String(80), default="Primary") + sort_order = db.Column(db.Integer, default=0) + + +class ProductSpecGroup(db.Model): + __tablename__ = "product_spec_groups" + + id = db.Column(db.Integer, primary_key=True) + product_id = db.Column(db.Integer, db.ForeignKey("products.id"), nullable=False) + title = db.Column(db.String(120), nullable=False) + sort_order = db.Column(db.Integer, default=0) + + specs = db.relationship("ProductSpec", backref="group", lazy=True, cascade="all, delete-orphan") + + +class ProductSpec(db.Model): + __tablename__ = "product_specs" + + id = db.Column(db.Integer, primary_key=True) + group_id = db.Column(db.Integer, db.ForeignKey("product_spec_groups.id"), nullable=False) + name = db.Column(db.String(120), nullable=False) + value = db.Column(db.String(240), nullable=False) + sort_order = db.Column(db.Integer, default=0) + + +class ProductVariant(db.Model): + __tablename__ = "product_variants" + + id = db.Column(db.Integer, primary_key=True) + product_id = db.Column(db.Integer, db.ForeignKey("products.id"), nullable=False) + label = db.Column(db.String(120), nullable=False) + variant_type = db.Column(db.String(40), default="Kit") + value = db.Column(db.String(120), nullable=False) + price_delta = db.Column(db.Float, default=0) + + +class ProductReview(db.Model): + __tablename__ = "product_reviews" + + id = db.Column(db.Integer, primary_key=True) + product_id = db.Column(db.Integer, db.ForeignKey("products.id"), nullable=False) + author_name = db.Column(db.String(120), nullable=False) + headline = db.Column(db.String(180), nullable=False) + body = db.Column(db.Text, nullable=False) + rating = db.Column(db.Integer, default=5) + verified_purchase = db.Column(db.Boolean, default=True) + created_at = db.Column(db.DateTime, default=datetime.utcnow) + + +class ProductQuestion(db.Model): + __tablename__ = "product_questions" + + id = db.Column(db.Integer, primary_key=True) + product_id = db.Column(db.Integer, db.ForeignKey("products.id"), nullable=False) + question = db.Column(db.Text, nullable=False) + asker_name = db.Column(db.String(120), nullable=False) + created_at = db.Column(db.DateTime, default=datetime.utcnow) + + answers = db.relationship("ProductAnswer", backref="question_ref", lazy=True, cascade="all, delete-orphan") + + +class ProductAnswer(db.Model): + __tablename__ = "product_answers" + + id = db.Column(db.Integer, primary_key=True) + question_id = db.Column(db.Integer, db.ForeignKey("product_questions.id"), nullable=False) + responder_name = db.Column(db.String(120), nullable=False) + answer = db.Column(db.Text, nullable=False) + created_at = db.Column(db.DateTime, default=datetime.utcnow) + + +class Bundle(db.Model): + __tablename__ = "bundles" + + id = db.Column(db.Integer, primary_key=True) + title = db.Column(db.String(180), nullable=False) + slug = db.Column(db.String(180), unique=True, nullable=False, index=True) + description = db.Column(db.Text, default="") + image_path = db.Column(db.String(220), default="") + bundle_price = db.Column(db.Float, nullable=False) + list_price = db.Column(db.Float, nullable=False) + badge = db.Column(db.String(60), default="Bundle") + audience = db.Column(db.String(120), default="") + featured = db.Column(db.Boolean, default=False) + + items = db.relationship("BundleItem", backref="bundle", lazy=True, cascade="all, delete-orphan") + + @property + def savings(self) -> float: + return max(self.list_price - self.bundle_price, 0) + + +class BundleItem(db.Model): + __tablename__ = "bundle_items" + + id = db.Column(db.Integer, primary_key=True) + bundle_id = db.Column(db.Integer, db.ForeignKey("bundles.id"), nullable=False) + product_id = db.Column(db.Integer, db.ForeignKey("products.id"), nullable=False) + quantity = db.Column(db.Integer, default=1) + + product = db.relationship("Product") + + +class CartItem(db.Model): + __tablename__ = "cart_items" + + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False) + product_id = db.Column(db.Integer, db.ForeignKey("products.id"), nullable=False) + quantity = db.Column(db.Integer, default=1) + variant_label = db.Column(db.String(120), default="") + bundle_label = db.Column(db.String(160), default="") + added_at = db.Column(db.DateTime, default=datetime.utcnow) + + product = db.relationship("Product") + + @property + def unit_price(self) -> float: + return self.product.display_price if self.product else 0 + + @property + def line_total(self) -> float: + return self.unit_price * self.quantity + + +class WishlistItem(db.Model): + __tablename__ = "wishlist_items" + + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False) + product_id = db.Column(db.Integer, db.ForeignKey("products.id"), nullable=False) + created_at = db.Column(db.DateTime, default=datetime.utcnow) + + product = db.relationship("Product") + + +class CompareItem(db.Model): + __tablename__ = "compare_items" + + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False) + product_id = db.Column(db.Integer, db.ForeignKey("products.id"), nullable=False) + created_at = db.Column(db.DateTime, default=datetime.utcnow) + + product = db.relationship("Product") + + +class StoreLocation(db.Model): + __tablename__ = "store_locations" + + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(140), nullable=False) + slug = db.Column(db.String(140), unique=True, nullable=False, index=True) + city = db.Column(db.String(80), nullable=False) + state = db.Column(db.String(40), nullable=False) + address = db.Column(db.String(200), nullable=False) + pickup_hours = db.Column(db.String(120), default="") + contact_phone = db.Column(db.String(40), default="") + inventory_note = db.Column(db.String(120), default="") + + inventory = db.relationship("StoreInventory", backref="store_location", lazy=True, cascade="all, delete-orphan") + reservations = db.relationship("StoreReservation", backref="store_location", lazy=True, cascade="all, delete-orphan") + + +class StoreInventory(db.Model): + __tablename__ = "store_inventory" + + id = db.Column(db.Integer, primary_key=True) + store_id = db.Column(db.Integer, db.ForeignKey("store_locations.id"), nullable=False) + product_id = db.Column(db.Integer, db.ForeignKey("products.id"), nullable=False) + quantity = db.Column(db.Integer, default=0) + pickup_eta = db.Column(db.String(120), default="") + + +class StoreReservation(db.Model): + __tablename__ = "store_reservations" + + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False) + store_id = db.Column(db.Integer, db.ForeignKey("store_locations.id"), nullable=False) + product_id = db.Column(db.Integer, db.ForeignKey("products.id"), nullable=False) + quantity = db.Column(db.Integer, default=1) + status = db.Column(db.String(40), default="Reserved") + pickup_window = db.Column(db.String(120), default="") + created_at = db.Column(db.DateTime, default=datetime.utcnow) + + product = db.relationship("Product") + + +class Order(db.Model): + __tablename__ = "orders" + + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False) + order_number = db.Column(db.String(40), unique=True, nullable=False) + status = db.Column(db.String(40), default="Processing") + subtotal = db.Column(db.Float, default=0) + shipping = db.Column(db.Float, default=0) + tax = db.Column(db.Float, default=0) + total = db.Column(db.Float, default=0) + fulfillment = db.Column(db.String(80), default="Ship to address") + payment_label = db.Column(db.String(120), default="Demo Visa ending in 4242") + note = db.Column(db.String(240), default="") + created_at = db.Column(db.DateTime, default=datetime.utcnow) + + items = db.relationship("OrderItem", backref="order", lazy=True, cascade="all, delete-orphan") + + +class OrderItem(db.Model): + __tablename__ = "order_items" + + id = db.Column(db.Integer, primary_key=True) + order_id = db.Column(db.Integer, db.ForeignKey("orders.id"), nullable=False) + product_id = db.Column(db.Integer, db.ForeignKey("products.id"), nullable=False) + product_name = db.Column(db.String(200), nullable=False) + image_path = db.Column(db.String(220), default="") + quantity = db.Column(db.Integer, default=1) + price = db.Column(db.Float, default=0) + variant_label = db.Column(db.String(120), default="") + + product = db.relationship("Product") + + +class Deal(db.Model): + __tablename__ = "deals" + + id = db.Column(db.Integer, primary_key=True) + product_id = db.Column(db.Integer, db.ForeignKey("products.id"), nullable=False) + label = db.Column(db.String(80), default="Deal") + sale_price = db.Column(db.Float, nullable=False) + deal_type = db.Column(db.String(40), default="sale") + is_active = db.Column(db.Boolean, default=True) + + +class SearchLog(db.Model): + __tablename__ = "search_logs" + + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey("users.id")) + query = db.Column(db.String(220), nullable=False) + scope = db.Column(db.String(80), default="all") + result_count = db.Column(db.Integer, default=0) + created_at = db.Column(db.DateTime, default=datetime.utcnow) + + +@login_manager.user_loader +def load_user(user_id: str): + return User.query.get(int(user_id)) + + +def tokenized(text: str) -> list[str]: + return [ + token + for token in re.split(r"[^a-zA-Z0-9]+", (text or "").lower()) + if token and token not in STOP_WORDS and len(token) > 1 + ] + + +def currency(value: float) -> str: + return f"${value:,.2f}" + + +def descendant_category_ids(category: Category) -> set[int]: + ids = {category.id} + for child in category.children: + ids.update(descendant_category_ids(child)) + return ids + + +def all_products() -> list[Product]: + return Product.query.options( + db.joinedload(Product.brand), + db.joinedload(Product.category), + db.joinedload(Product.deals), + db.joinedload(Product.images), + db.joinedload(Product.spec_groups).joinedload(ProductSpecGroup.specs), + ).all() + + +def product_search_score(product: Product, query: str) -> int: + tokens = tokenized(query) + if not tokens: + return 0 + text = " ".join( + [ + product.name, + product.short_description, + product.description, + product.search_blob, + product.brand.name if product.brand else "", + product.category.name if product.category else "", + ] + ).lower() + return sum(1 for token in tokens if token in text) + + +def apply_product_filters(products: list[Product], args, *, query_text: str = "") -> list[Product]: + filtered = list(products) + + if query_text: + scored = [] + for product in filtered: + score = product_search_score(product, query_text) + if score > 0: + scored.append((product, score)) + filtered = [product for product, _score in sorted(scored, key=lambda item: (-item[1], item[0].best_seller_rank, item[0].name))] + + brand_slug = args.get("brand", "").strip() + if brand_slug: + filtered = [product for product in filtered if product.brand and product.brand.slug == brand_slug] + + min_price = args.get("min_price", "").strip() + if min_price: + try: + threshold = float(min_price) + filtered = [product for product in filtered if product.display_price >= threshold] + except ValueError: + pass + + max_price = args.get("max_price", "").strip() + if max_price: + try: + threshold = float(max_price) + filtered = [product for product in filtered if product.display_price <= threshold] + except ValueError: + pass + + rating_filter = args.get("rating", "").strip() + if rating_filter: + try: + threshold = float(rating_filter) + filtered = [product for product in filtered if product.rating >= threshold] + except ValueError: + pass + + availability = args.get("availability", "").strip() + if availability == "in-stock": + filtered = [product for product in filtered if product.availability == "In Stock"] + elif availability == "preorder": + filtered = [product for product in filtered if "Pre-Order" in product.availability] + elif availability == "pickup": + filtered = [product for product in filtered if product.pickup_available and product.pickup_store_count > 0] + + condition = args.get("condition", "").strip() + if condition: + filtered = [product for product in filtered if product.condition.lower() == condition.lower()] + + sensor_size = args.get("sensor_size", "").strip() + if sensor_size: + filtered = [product for product in filtered if product.sensor_size == sensor_size] + + mount = args.get("mount", "").strip() + if mount: + filtered = [product for product in filtered if product.mount_type == mount] + + focal_length = args.get("focal_length", "").strip() + if focal_length: + filtered = [product for product in filtered if product.focal_length_bucket == focal_length] + + megapixels = args.get("megapixels", "").strip() + if megapixels: + try: + threshold = float(megapixels) + filtered = [product for product in filtered if product.megapixels >= threshold] + except ValueError: + pass + + capacity = args.get("capacity", "").strip() + if capacity == "256gb": + filtered = [product for product in filtered if product.capacity_gb >= 256] + elif capacity == "1tb": + filtered = [product for product in filtered if product.capacity_gb >= 1024] + + connectivity = args.get("connectivity", "").strip() + if connectivity: + filtered = [product for product in filtered if connectivity.lower() in (product.connectivity or "").lower()] + + pickup = args.get("pickup", "").strip() + if pickup == "yes": + filtered = [product for product in filtered if product.pickup_available and product.pickup_store_count > 0] + + sort_key = args.get("sort", "relevance") + if sort_key == "price_asc": + filtered.sort(key=lambda product: (product.display_price, product.best_seller_rank, product.name)) + elif sort_key == "price_desc": + filtered.sort(key=lambda product: (-product.display_price, product.best_seller_rank, product.name)) + elif sort_key == "newest": + filtered.sort(key=lambda product: (-product.sort_newness, product.name)) + elif sort_key == "rating": + filtered.sort(key=lambda product: (-product.rating, -product.review_count, product.name)) + elif sort_key == "bestsellers": + filtered.sort(key=lambda product: (product.best_seller_rank, product.name)) + elif sort_key == "name": + filtered.sort(key=lambda product: product.name) + elif not query_text: + filtered.sort(key=lambda product: (product.best_seller_rank, product.name)) + + return filtered + + +def filters_for(products: list[Product]) -> dict: + return { + "brands": sorted({product.brand.slug: product.brand.name for product in products if product.brand}.items(), key=lambda item: item[1]), + "sensor_sizes": sorted({product.sensor_size for product in products if product.sensor_size}), + "mounts": sorted({product.mount_type for product in products if product.mount_type}), + "focal_lengths": sorted({product.focal_length_bucket for product in products if product.focal_length_bucket}), + "connectivity": sorted({product.connectivity for product in products if product.connectivity}), + } + + +def current_compare_products() -> list[Product]: + compare_ids = [] + if current_user.is_authenticated: + compare_ids = [item.product_id for item in current_user.compare_items] + else: + compare_ids = session.get("compare_ids", []) + if not compare_ids: + return [] + products = Product.query.filter(Product.id.in_(compare_ids[:4])).all() + products.sort(key=lambda product: compare_ids.index(product.id)) + return products + + +def cart_metrics(): + if not current_user.is_authenticated: + return {"count": 0, "subtotal": 0.0} + items = current_user.cart_items + return { + "count": sum(item.quantity for item in items), + "subtotal": round(sum(item.line_total for item in items), 2), + } + + +def order_totals_for(items: list[CartItem]) -> dict: + subtotal = round(sum(item.line_total for item in items), 2) + shipping = 0 if subtotal >= 99 else 14.95 + tax = round(subtotal * 0.08875, 2) + total = round(subtotal + shipping + tax, 2) + return {"subtotal": subtotal, "shipping": shipping, "tax": tax, "total": total} + + +def store_options_for(product: Product) -> list[StoreInventory]: + inventory = sorted(product.store_inventory, key=lambda item: (-item.quantity, item.store_location.city)) + return [item for item in inventory if item.quantity > 0] + + +def merge_compare_into_session(product_id: int) -> None: + compare_ids = session.get("compare_ids", []) + if product_id not in compare_ids: + compare_ids.append(product_id) + session["compare_ids"] = compare_ids[:4] + session.modified = True + + +def compare_cell_map(products: list[Product]) -> dict: + grouped = defaultdict(list) + all_names = defaultdict(list) + for product in products: + for group in sorted(product.spec_groups, key=lambda item: item.sort_order): + for spec in sorted(group.specs, key=lambda item: item.sort_order): + grouped[group.title].append((product.id, spec.name, spec.value)) + all_names[group.title].append(spec.name) + + result = {} + for group_name, rows in grouped.items(): + names = [] + seen = set() + for name in all_names[group_name]: + if name not in seen: + names.append(name) + seen.add(name) + group_rows = [] + for spec_name in names: + values = {} + for product in products: + values[product.id] = product.top_spec_map.get(spec_name, "—") + differences = len(set(values.values())) > 1 + group_rows.append({"name": spec_name, "values": values, "different": differences}) + result[group_name] = group_rows + return result + + +def build_compare_rows(products: list[Product]) -> dict: + grouped_names = defaultdict(list) + spec_lookup = {} + + for product in products: + per_product_specs = {} + for group in sorted(product.spec_groups, key=lambda item: item.sort_order): + grouped_names[group.title] + for spec in sorted(group.specs, key=lambda item: item.sort_order): + grouped_names[group.title].append(spec.name) + per_product_specs[spec.name] = spec.value + spec_lookup[product.id] = per_product_specs + + compare_rows = {} + for group_name, spec_names in grouped_names.items(): + ordered_names = [] + seen = set() + for spec_name in spec_names: + if spec_name not in seen: + ordered_names.append(spec_name) + seen.add(spec_name) + rows = [] + for spec_name in ordered_names: + cells = { + product.id: spec_lookup.get(product.id, {}).get(spec_name, "--") + for product in products + } + rows.append( + { + "name": spec_name, + "cells": cells, + "different": len(set(cells.values())) > 1, + } + ) + compare_rows[group_name] = rows + return compare_rows + + +def log_search(query: str, scope: str, result_count: int) -> None: + if not query: + return + entry = SearchLog( + user_id=current_user.id if current_user.is_authenticated else None, + query=query[:220], + scope=scope[:80], + result_count=result_count, + ) + db.session.add(entry) + db.session.commit() + + +@app.template_filter("currency") +def currency_filter(value: float) -> str: + return currency(value) + + +@app.context_processor +def inject_globals(): + top_categories = ( + Category.query.filter_by(parent_id=None).order_by(Category.nav_order, Category.name).all() + ) + featured_brands = Brand.query.order_by(Brand.name).limit(10).all() + metrics = cart_metrics() + return { + "top_categories": top_categories, + "featured_brands": featured_brands, + "cart_count": metrics["count"], + "compare_count": len(current_compare_products()), + "wishlist_count": len(current_user.wishlist_items) if current_user.is_authenticated else 0, + "demo_notice": "Local benchmark mirror with deterministic demo inventory, users, orders, and checkout flows.", + } + + +@app.route("/") +def index(): + featured = Product.query.filter_by(is_featured=True).order_by(Product.best_seller_rank).limit(8).all() + deals = Product.query.join(Deal).filter(Deal.is_active.is_(True)).order_by(Product.best_seller_rank).limit(6).all() + used_highlights = Product.query.filter(Product.condition != "New").order_by(Product.rating.desc()).limit(6).all() + bundles = Bundle.query.order_by(Bundle.featured.desc(), Bundle.title).limit(4).all() + categories = Category.query.filter_by(parent_id=None).order_by(Category.nav_order).all() + spotlight = Product.query.filter_by(is_bundle_anchor=True).order_by(Product.best_seller_rank).limit(4).all() + return render_template( + "index.html", + featured=featured, + deals=deals, + used_highlights=used_highlights, + bundles=bundles, + categories=categories, + spotlight=spotlight, + ) + + +@app.route("/categories") +def categories(): + top_categories = Category.query.filter_by(parent_id=None).order_by(Category.nav_order).all() + return render_template("categories.html", categories=top_categories) + + +@app.route("/c/") +def category_view(slug: str): + category = Category.query.filter_by(slug=slug).first_or_404() + ids = descendant_category_ids(category) + products = [product for product in all_products() if product.category_id in ids] + results = apply_product_filters(products, request.args) + return render_template( + "category_listing.html", + page_title=category.name, + page_heading=category.name, + page_description=category.hero_copy or category.description, + category=category, + products=results, + filters=filters_for(products), + base_products=products, + active_tab=category.slug, + ) + + +@app.route("/search") +def search(): + query_text = request.args.get("q", "").strip() + products = all_products() + results = apply_product_filters(products, request.args, query_text=query_text) + log_search(query_text, "search", len(results)) + return render_template( + "category_listing.html", + page_title="Search", + page_heading=f"Search results for “{query_text}”" if query_text else "Search the catalog", + page_description="Find cameras, lenses, lighting, audio, and pro workstation gear across the local benchmark catalog.", + category=None, + products=results, + filters=filters_for(products), + base_products=products, + active_tab="search", + search_query=query_text, + ) + + +@app.route("/brand/") +def brand_view(brand_slug: str): + brand = Brand.query.filter_by(slug=brand_slug).first_or_404() + products = [product for product in all_products() if product.brand_id == brand.id] + results = apply_product_filters(products, request.args) + return render_template( + "category_listing.html", + page_title=brand.name, + page_heading=brand.name, + page_description=brand.blurb, + category=None, + brand=brand, + products=results, + filters=filters_for(products), + base_products=products, + active_tab="brand", + ) + + +def render_product_tab(product_slug: str, active_tab: str): + product = Product.query.filter_by(slug=product_slug).first_or_404() + related = Product.query.filter( + Product.id != product.id, + Product.subcategory_slug == product.subcategory_slug, + ).order_by(Product.best_seller_rank).limit(4).all() + return render_template( + "product_detail.html", + product=product, + active_tab=active_tab, + related=related, + top_specs=list(product.top_spec_map.items())[:6], + inventory=store_options_for(product), + compare_ids=[item.id for item in current_compare_products()], + ) + + +@app.route("/product/") +def product_detail(product_slug: str): + return render_product_tab(product_slug, "overview") + + +@app.route("/product//specs") +def product_specs(product_slug: str): + return render_product_tab(product_slug, "specs") + + +@app.route("/product//reviews") +def product_reviews(product_slug: str): + return render_product_tab(product_slug, "reviews") + + +@app.route("/product//qa") +def product_qa(product_slug: str): + return render_product_tab(product_slug, "qa") + + +@app.route("/compare") +def compare(): + products = current_compare_products() + if not products and request.args.get("slugs"): + slugs = [slug.strip() for slug in request.args.get("slugs", "").split(",") if slug.strip()] + products = Product.query.filter(Product.slug.in_(slugs[:4])).all() + products.sort(key=lambda product: slugs.index(product.slug)) + return render_template( + "compare.html", + products=products, + compare_rows=build_compare_rows(products), + ) + + +@app.route("/deals") +def deals(): + products = Product.query.join(Deal).filter(Deal.is_active.is_(True)).all() + results = apply_product_filters(products, request.args) + return render_template( + "category_listing.html", + page_title="Deals", + page_heading="Deals and daily savings", + page_description="Current sale pricing, open-box spotlights, and editor-picked specials across photo, video, and creator tech.", + category=None, + products=results, + filters=filters_for(products), + base_products=products, + active_tab="deals", + ) + + +@app.route("/used") +def used(): + products = Product.query.filter(Product.condition != "New").all() + results = apply_product_filters(products, request.args) + return render_template( + "category_listing.html", + page_title="Used", + page_heading="Used and open-box", + page_description="Deterministic demo inventory for pre-owned, open-box, and pro-verified creator gear.", + category=None, + products=results, + filters=filters_for(products), + base_products=products, + active_tab="used", + ) + + +@app.route("/bundles") +def bundles(): + bundles_list = Bundle.query.order_by(Bundle.featured.desc(), Bundle.title).all() + return render_template("bundles.html", bundles=bundles_list) + + +@app.route("/bundle//add", methods=["POST"]) +@login_required +def add_bundle_to_cart(bundle_slug: str): + bundle = Bundle.query.filter_by(slug=bundle_slug).first_or_404() + for item in bundle.items: + existing = CartItem.query.filter_by( + user_id=current_user.id, + product_id=item.product_id, + bundle_label=bundle.title, + ).first() + if existing: + existing.quantity += item.quantity + else: + db.session.add( + CartItem( + user_id=current_user.id, + product_id=item.product_id, + quantity=item.quantity, + bundle_label=bundle.title, + ) + ) + db.session.commit() + flash(f"{bundle.title} was added to your cart.", "success") + return redirect(url_for("cart")) + + +@app.route("/store-pickup") +def store_pickup(): + stores = StoreLocation.query.order_by(StoreLocation.city).all() + featured = Product.query.filter_by(pickup_available=True).order_by(Product.best_seller_rank).limit(10).all() + product = None + inventory = [] + if request.args.get("product"): + product = Product.query.filter_by(slug=request.args["product"]).first() + if product: + inventory = store_options_for(product) + reservations = current_user.reservations if current_user.is_authenticated else [] + return render_template( + "store_pickup.html", + stores=stores, + featured=featured, + product=product, + inventory=inventory, + reservations=reservations, + ) + + +@app.route("/help") +def help_page(): + featured_products = Product.query.order_by(Product.best_seller_rank).limit(3).all() + help_cards = [ + { + "title": "Returns and exchanges", + "copy": "Demo orders carry a clear 30-day return window with synthetic RMA language that mirrors a pro retailer workflow.", + }, + { + "title": "Shipping and pickup", + "copy": "Every shipping timeline and pickup ETA on this mirror is deterministic and local-only. Nothing reaches live couriers or stores.", + }, + { + "title": "Trade-in and used gear", + "copy": "Used and open-box catalog pages include condition grading, accessory notes, and limited stock badges for benchmark tasks.", + }, + ] + return render_template("help.html", help_cards=help_cards, featured_products=featured_products) + + +@app.route("/contact", methods=["GET", "POST"]) +def contact(): + submitted = False + if request.method == "POST": + submitted = True + flash("Your demo support request was saved locally for benchmark flow testing.", "success") + return render_template("contact.html", submitted=submitted) + + +@app.route("/login", methods=["GET", "POST"]) +def login(): + if current_user.is_authenticated: + return redirect(url_for("account")) + if request.method == "POST": + email = request.form.get("email", "").strip().lower() + password = request.form.get("password", "") + user = User.query.filter_by(email=email).first() + if user and user.check_password(password): + login_user(user) + flash("Signed in to your B&H demo account.", "success") + next_url = request.args.get("next") + return redirect(next_url or url_for("account")) + flash("That demo email/password combination did not match.", "danger") + return render_template("login.html") + + +@app.route("/register", methods=["GET", "POST"]) +def register(): + if current_user.is_authenticated: + return redirect(url_for("account")) + if request.method == "POST": + display_name = request.form.get("display_name", "").strip() + username = request.form.get("username", "").strip().lower() + email = request.form.get("email", "").strip().lower() + password = request.form.get("password", "") + confirm = request.form.get("confirm_password", "") + if not display_name or not username or not email or not password: + flash("Please complete every required registration field.", "danger") + elif password != confirm: + flash("Passwords must match.", "danger") + elif User.query.filter((User.email == email) | (User.username == username)).first(): + flash("That demo account already exists.", "warning") + else: + user = User( + display_name=display_name, + username=username, + email=email, + phone=request.form.get("phone", "").strip(), + company=request.form.get("company", "").strip(), + role=request.form.get("role", "").strip() or "Creator", + ) + user.set_password(password) + db.session.add(user) + db.session.flush() + db.session.add( + Address( + user_id=user.id, + label="Studio", + recipient=display_name, + line1=request.form.get("line1", "").strip() or "100 Demo Plaza", + city=request.form.get("city", "").strip() or "New York", + state=request.form.get("state", "").strip() or "NY", + zip_code=request.form.get("zip_code", "").strip() or "10001", + phone=user.phone, + is_default=True, + ) + ) + db.session.commit() + login_user(user) + flash("Your B&H demo account is ready.", "success") + return redirect(url_for("account")) + return render_template("register.html") + + +@app.route("/logout") +def logout(): + if current_user.is_authenticated: + logout_user() + flash("You have been signed out of the demo mirror.", "info") + return redirect(url_for("index")) + + +@app.route("/account") +@login_required +def account(): + reservations = current_user.reservations[:4] + return render_template("account.html", reservations=reservations) + + +@app.route("/account/edit", methods=["GET", "POST"]) +@login_required +def account_edit(): + if request.method == "POST": + current_user.display_name = request.form.get("display_name", "").strip() or current_user.display_name + current_user.phone = request.form.get("phone", "").strip() + current_user.company = request.form.get("company", "").strip() + current_user.role = request.form.get("role", "").strip() or current_user.role + current_user.newsletter_opt_in = request.form.get("newsletter_opt_in") == "on" + current_user.sms_opt_in = request.form.get("sms_opt_in") == "on" + preferred_store = request.form.get("preferred_store_id", "").strip() + if preferred_store.isdigit(): + current_user.preferred_store_id = int(preferred_store) + db.session.commit() + flash("Your demo account preferences were updated.", "success") + return redirect(url_for("account")) + stores = StoreLocation.query.order_by(StoreLocation.city).all() + return render_template("account_edit.html", stores=stores) + + +@app.route("/account/orders") +@login_required +def account_orders(): + orders = Order.query.filter_by(user_id=current_user.id).order_by(Order.created_at.desc()).all() + return render_template("orders.html", orders=orders) + + +@app.route("/account/wishlist") +@login_required +def account_wishlist(): + items = WishlistItem.query.filter_by(user_id=current_user.id).order_by(WishlistItem.created_at.desc()).all() + return render_template("wishlist.html", items=items) + + +@app.route("/account/compare") +@login_required +def account_compare(): + products = [item.product for item in CompareItem.query.filter_by(user_id=current_user.id).all()] + return render_template("compare.html", products=products, compare_rows=build_compare_rows(products), account_mode=True) + + +@app.route("/account/addresses") +@login_required +def account_addresses(): + return render_template("addresses.html", addresses=current_user.addresses) + + +@app.route("/wishlist/toggle/", methods=["POST"]) +@login_required +def toggle_wishlist(product_slug: str): + product = Product.query.filter_by(slug=product_slug).first_or_404() + existing = WishlistItem.query.filter_by(user_id=current_user.id, product_id=product.id).first() + if existing: + db.session.delete(existing) + flash(f"{product.name} was removed from your wishlist.", "info") + else: + db.session.add(WishlistItem(user_id=current_user.id, product_id=product.id)) + flash(f"{product.name} was saved to your wishlist.", "success") + db.session.commit() + return redirect(request.referrer or url_for("product_detail", product_slug=product.slug)) + + +@app.route("/compare/add/", methods=["POST"]) +def add_compare(product_slug: str): + product = Product.query.filter_by(slug=product_slug).first_or_404() + if current_user.is_authenticated: + existing = CompareItem.query.filter_by(user_id=current_user.id, product_id=product.id).first() + if not existing: + if CompareItem.query.filter_by(user_id=current_user.id).count() >= 4: + oldest = CompareItem.query.filter_by(user_id=current_user.id).order_by(CompareItem.created_at).first() + if oldest: + db.session.delete(oldest) + db.session.add(CompareItem(user_id=current_user.id, product_id=product.id)) + db.session.commit() + else: + merge_compare_into_session(product.id) + flash(f"{product.name} was added to compare.", "success") + return redirect(request.referrer or url_for("compare")) + + +@app.route("/compare/remove/", methods=["POST"]) +def remove_compare(product_slug: str): + product = Product.query.filter_by(slug=product_slug).first_or_404() + if current_user.is_authenticated: + existing = CompareItem.query.filter_by(user_id=current_user.id, product_id=product.id).first() + if existing: + db.session.delete(existing) + db.session.commit() + else: + compare_ids = session.get("compare_ids", []) + session["compare_ids"] = [pid for pid in compare_ids if pid != product.id] + session.modified = True + flash(f"{product.name} was removed from compare.", "info") + return redirect(request.referrer or url_for("compare")) + + +@app.route("/cart") +@login_required +def cart(): + items = CartItem.query.filter_by(user_id=current_user.id).order_by(CartItem.added_at.desc()).all() + totals = order_totals_for(items) + return render_template("cart.html", items=items, totals=totals) + + +@app.route("/cart/add/", methods=["POST"]) +@login_required +def add_to_cart(product_slug: str): + product = Product.query.filter_by(slug=product_slug).first_or_404() + quantity = max(int(request.form.get("quantity", 1) or 1), 1) + variant_label = request.form.get("variant_label", "").strip() + existing = CartItem.query.filter_by( + user_id=current_user.id, + product_id=product.id, + variant_label=variant_label, + bundle_label="", + ).first() + if existing: + existing.quantity += quantity + else: + db.session.add( + CartItem( + user_id=current_user.id, + product_id=product.id, + quantity=quantity, + variant_label=variant_label, + ) + ) + db.session.commit() + flash(f"{product.name} was added to your cart.", "success") + return redirect(request.referrer or url_for("cart")) + + +@app.route("/cart/update/", methods=["POST"]) +@login_required +def update_cart(item_id: int): + item = CartItem.query.filter_by(id=item_id, user_id=current_user.id).first_or_404() + quantity = max(int(request.form.get("quantity", 1) or 1), 1) + item.quantity = quantity + db.session.commit() + flash("Your cart quantity was updated.", "success") + return redirect(url_for("cart")) + + +@app.route("/cart/remove/", methods=["POST"]) +@login_required +def remove_cart_item(item_id: int): + item = CartItem.query.filter_by(id=item_id, user_id=current_user.id).first_or_404() + db.session.delete(item) + db.session.commit() + flash("That item was removed from your cart.", "info") + return redirect(url_for("cart")) + + +@app.route("/reserve/", methods=["POST"]) +@login_required +def reserve_store_pickup(product_slug: str): + product = Product.query.filter_by(slug=product_slug).first_or_404() + store_id = int(request.form.get("store_id", 0) or 0) + quantity = max(int(request.form.get("quantity", 1) or 1), 1) + inventory = StoreInventory.query.filter_by(product_id=product.id, store_id=store_id).first() + if not inventory or inventory.quantity < quantity: + flash("That pickup slot is no longer available in this demo inventory.", "danger") + return redirect(url_for("store_pickup", product=product.slug)) + + reservation = StoreReservation( + user_id=current_user.id, + store_id=store_id, + product_id=product.id, + quantity=quantity, + status="Reserved", + pickup_window=inventory.pickup_eta, + ) + db.session.add(reservation) + db.session.commit() + flash(f"{product.name} is reserved for in-store pickup.", "success") + return redirect(url_for("store_pickup", product=product.slug)) + + +@app.route("/checkout", methods=["GET", "POST"]) +@login_required +def checkout(): + items = CartItem.query.filter_by(user_id=current_user.id).order_by(CartItem.added_at.desc()).all() + if not items: + flash("Your cart is empty. Add something before starting checkout.", "warning") + return redirect(url_for("cart")) + totals = order_totals_for(items) + addresses = current_user.addresses + if request.method == "POST": + fulfillment = request.form.get("fulfillment", "Ship to address").strip() or "Ship to address" + payment_label = request.form.get("payment_label", "Demo Visa ending in 4242").strip() or "Demo Visa ending in 4242" + note = request.form.get("note", "").strip() + order_number = f"BH-{datetime.utcnow().strftime('%Y%m%d-%H%M%S')}-{current_user.id:02d}" + order = Order( + user_id=current_user.id, + order_number=order_number, + status="Confirmed", + subtotal=totals["subtotal"], + shipping=totals["shipping"], + tax=totals["tax"], + total=totals["total"], + fulfillment=fulfillment, + payment_label=payment_label, + note=note, + ) + db.session.add(order) + db.session.flush() + for item in items: + db.session.add( + OrderItem( + order_id=order.id, + product_id=item.product_id, + product_name=item.product.name, + image_path=item.product.main_image, + quantity=item.quantity, + price=item.unit_price, + variant_label=item.variant_label or item.bundle_label, + ) + ) + db.session.delete(item) + db.session.commit() + flash("Your demo checkout was completed locally.", "success") + return redirect(url_for("order_receipt", order_number=order.order_number)) + return render_template("checkout.html", items=items, totals=totals, addresses=addresses) + + +@app.route("/order/") +@login_required +def order_receipt(order_number: str): + order = Order.query.filter_by(order_number=order_number, user_id=current_user.id).first_or_404() + return render_template("order_receipt.html", order=order) + + +@app.route("/contact-support") +def contact_support_redirect(): + return redirect(url_for("contact")) + + +@app.route("/_health") +def health(): + return {"ok": True, "site": "bh_photo"} + + +MODEL_REGISTRY = { + "User": User, + "Address": Address, + "Category": Category, + "Brand": Brand, + "Product": Product, + "ProductImage": ProductImage, + "ProductSpecGroup": ProductSpecGroup, + "ProductSpec": ProductSpec, + "ProductVariant": ProductVariant, + "ProductReview": ProductReview, + "ProductQuestion": ProductQuestion, + "ProductAnswer": ProductAnswer, + "Bundle": Bundle, + "BundleItem": BundleItem, + "CartItem": CartItem, + "WishlistItem": WishlistItem, + "CompareItem": CompareItem, + "StoreLocation": StoreLocation, + "StoreInventory": StoreInventory, + "StoreReservation": StoreReservation, + "Order": Order, + "OrderItem": OrderItem, + "Deal": Deal, + "SearchLog": SearchLog, +} + + +with app.app_context(): + db.create_all() + from seed_data import seed_benchmark_users, seed_database + + seed_database(db, MODEL_REGISTRY, BASE_DIR) + seed_benchmark_users(db, MODEL_REGISTRY) + + +if __name__ == "__main__": + port = int(os.environ.get("PORT", 5000)) + app.run(host="0.0.0.0", port=port, debug=False) diff --git a/sites/bh_photo/requirements.txt b/sites/bh_photo/requirements.txt new file mode 100644 index 000000000..c5de2312d --- /dev/null +++ b/sites/bh_photo/requirements.txt @@ -0,0 +1,4 @@ +Flask +Flask-Login +Flask-SQLAlchemy +Flask-Bcrypt diff --git a/sites/bh_photo/seed_data.py b/sites/bh_photo/seed_data.py new file mode 100644 index 000000000..f793fd2a8 --- /dev/null +++ b/sites/bh_photo/seed_data.py @@ -0,0 +1,1575 @@ +import shutil +from datetime import datetime, timedelta +from pathlib import Path + + +MIRROR_REFERENCE_DATE = datetime(2026, 4, 18, 10, 0, 0) +BENCHMARK_PASSWORD = "TestPass123!" + + +CATEGORY_DEFS = [ + {"name": "Photography", "slug": "photography", "description": "Camera bodies, lenses, support gear, and storage built for stills workflows.", "hero_copy": "Browse mirrorless cameras, pro lenses, support systems, and storage cards with filter-heavy B&H style browsing.", "icon_label": "Photo", "nav_order": 1}, + {"name": "Video", "slug": "video", "description": "Cinema capture, drones, monitors, and production bundles for hybrid teams.", "hero_copy": "Explore cinema cameras, drones, monitor recorders, and creator-focused video production tools.", "icon_label": "Video", "nav_order": 2}, + {"name": "Audio", "slug": "audio", "description": "Microphones, monitoring, and recording tools for creators and live production.", "hero_copy": "Compare wireless kits, broadcast mics, and reference headphones with pickup and bundle options.", "icon_label": "Audio", "nav_order": 3}, + {"name": "Computers", "slug": "computers", "description": "Workstations, displays, and print gear for post-production and studio delivery.", "hero_copy": "Shop creator laptops, calibration-ready monitors, and output devices with side-by-side spec comparisons.", "icon_label": "Compute", "nav_order": 4}, + {"name": "Lighting", "slug": "lighting", "description": "LED fixtures, modifiers, and kits for photo and video sets.", "hero_copy": "Find compact LEDs, RGB panels, and soft source kits with realistic tech specs and stock badges.", "icon_label": "Light", "nav_order": 5}, + {"name": "Mirrorless Cameras", "slug": "mirrorless-cameras", "parent": "photography", "description": "Hybrid stills and video camera bodies."}, + {"name": "DSLR Cameras", "slug": "dslr-cameras", "parent": "photography", "description": "Optical viewfinder cameras for sports and studio work."}, + {"name": "Camera Lenses", "slug": "camera-lenses", "parent": "photography", "description": "Wide, standard, and telephoto glass across major mounts."}, + {"name": "Tripods & Supports", "slug": "tripods-supports", "parent": "photography", "description": "Travel, studio, and video support tools."}, + {"name": "Memory Cards & Storage", "slug": "memory-cards-storage", "parent": "photography", "description": "Capture media, SSDs, and workflow storage."}, + {"name": "Cinema Cameras", "slug": "cinema-cameras", "parent": "video", "description": "Compact and studio-ready digital cinema tools."}, + {"name": "Drones", "slug": "drones", "parent": "video", "description": "Aerial platforms for creator and production teams."}, + {"name": "Monitors & Recorders", "slug": "monitors-recorders", "parent": "video", "description": "Field monitors, recorders, and director displays."}, + {"name": "Microphones", "slug": "microphones", "parent": "audio", "description": "Wireless, shotgun, and desktop recording microphones."}, + {"name": "Headphones", "slug": "headphones", "parent": "audio", "description": "Reference and field monitoring headphones."}, + {"name": "Laptops", "slug": "laptops", "parent": "computers", "description": "Creator laptops for edit, color, and tethered capture."}, + {"name": "Monitors", "slug": "monitors", "parent": "computers", "description": "Color-critical and office monitors."}, + {"name": "Printers & Scanners", "slug": "printers-scanners", "parent": "computers", "description": "Proofing printers and document/photo scanners."}, + {"name": "Lighting", "slug": "lighting-kits", "parent": "lighting", "description": "LED monolights, RGB panels, and modifiers."}, +] + + +BRAND_DEFS = [ + ("Canon", "Japan", "#d0282b", "Hybrid stills and imaging tools with strong autofocus and creator-friendly ergonomics."), + ("Nikon", "Japan", "#ffd334", "Photo-forward systems known for dependable handling and deep color."), + ("Sony", "Japan", "#2a3a63", "Hybrid imaging, creator audio, and monitoring gear with modern connectivity."), + ("Fujifilm", "Japan", "#7d1f2c", "Compact creator cameras and film-inspired imaging tools."), + ("Panasonic", "Japan", "#39435f", "Video-centric bodies and compact cinema hardware."), + ("Blackmagic", "Australia", "#202020", "Cinema capture systems and production monitoring gear."), + ("Sigma", "Japan", "#54606c", "Art and contemporary lenses with sharp optical design."), + ("Tamron", "Japan", "#0d6b57", "Flexible travel zooms and compact creator glass."), + ("DJI", "China", "#1d1d1d", "Aerial and wireless capture tools for modern production."), + ("Rode", "Australia", "#1776b6", "Portable audio capture and creator microphones."), + ("Sennheiser", "Germany", "#0a3f8c", "Reference monitoring and broadcast audio solutions."), + ("SanDisk", "United States", "#cc1f24", "High-speed capture media and rugged SSD storage."), + ("Lexar", "United States", "#bf7d0a", "Workflow media and creator storage accessories."), + ("Apple", "United States", "#4d4d4d", "Portable creator computers and calibrated displays."), + ("Dell", "United States", "#1563c7", "Workstations, creator laptops, and high-resolution monitors."), + ("BenQ", "Taiwan", "#4f6d52", "Color-accurate displays for editing and retouching."), + ("Aputure", "China", "#a05b10", "Professional LED lighting systems for location and studio setups."), + ("Manfrotto", "Italy", "#8f2334", "Tripods and supports for field production."), + ("Peak Design", "United States", "#333333", "Creator carry gear and modular support accessories."), + ("Atomos", "Australia", "#ea5a0b", "Field monitors and recorders for production crews."), + ("Shure", "United States", "#5a1d4c", "Reliable speech, podcast, and broadcast capture."), + ("ASUS", "Taiwan", "#1e5aa8", "Creator and pro-performance notebooks and monitors."), + ("Epson", "Japan", "#2e5d98", "Photo output and scanning tools for studio workflows."), + ("Godox", "China", "#825700", "Accessible lighting tools with strong feature density."), + ("Benro", "China", "#00584c", "Video heads and compact supports for travel production."), +] + + +STORE_DEFS = [ + ("NYC SuperStore", "nyc-superstore", "New York", "NY", "420 Demo Ave, Manhattan, NY 10001", "Mon-Sat 9am-8pm", "(212) 555-0140", "Local benchmark pickup counter"), + ("Brooklyn Creator Desk", "brooklyn-creator-desk", "Brooklyn", "NY", "55 Flatbush Demo Way, Brooklyn, NY 11217", "Daily 10am-7pm", "(718) 555-0111", "Fast bag-and-tag reservation lane"), + ("Jersey City Pro Hub", "jersey-city-pro-hub", "Jersey City", "NJ", "91 Harbor Plaza, Jersey City, NJ 07302", "Mon-Sat 10am-6pm", "(201) 555-0168", "Broadcast and cinema pickup"), + ("White Plains Pickup", "white-plains-pickup", "White Plains", "NY", "17 Mamaroneck Ave, White Plains, NY 10601", "Tue-Sun 10am-6pm", "(914) 555-0122", "Suburban pickup desk"), + ("Los Angeles Creator Hub", "los-angeles-creator-hub", "Los Angeles", "CA", "300 Olive St, Los Angeles, CA 90013", "Daily 10am-7pm", "(323) 555-0185", "West coast same-day counter"), + ("Chicago Pro Counter", "chicago-pro-counter", "Chicago", "IL", "201 State St, Chicago, IL 60601", "Mon-Sat 9am-7pm", "(312) 555-0199", "Lighting and grip reserve desk"), + ("Miami Imaging Desk", "miami-imaging-desk", "Miami", "FL", "88 Biscayne Blvd, Miami, FL 33132", "Daily 11am-7pm", "(305) 555-0156", "Aerial and imaging pickup"), + ("Austin Broadcast Pickup", "austin-broadcast-pickup", "Austin", "TX", "620 Congress Ave, Austin, TX 78701", "Mon-Fri 9am-6pm", "(512) 555-0137", "Compact pro video counter"), +] + + +USER_DEFS = [ + {"username": "alice_j", "email": "alice.j@test.com", "display_name": "Alice Johnson", "company": "Northlight Weddings", "role": "Photographer"}, + {"username": "bob_c", "email": "bob.c@test.com", "display_name": "Bob Chen", "company": "Studio Meridian", "role": "Video Producer"}, + {"username": "carol_d", "email": "carol.d@test.com", "display_name": "Carol Davis", "company": "Signal Audio", "role": "Podcast Producer"}, + {"username": "david_k", "email": "david.k@test.com", "display_name": "David Kim", "company": "Frame & Color", "role": "Editor"}, +] + + +def slugify(text: str) -> str: + return ( + text.lower() + .replace("&", " and ") + .replace("+", " plus ") + .replace("/", " ") + .replace("'", "") + .replace(",", " ") + .replace(".", " ") + ).strip().replace(" ", " ").replace(" ", "-") + + +def ensure_svg(path: Path, title: str, subtitle: str, accent: str, product_type: str) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + if path.exists(): + return + + if product_type in {"Mirrorless Camera", "DSLR Camera", "Cinema Camera"}: + silhouette = """ + + + + + + """ + elif product_type == "Lens": + silhouette = """ + + + + + + """ + elif product_type in {"Tripod", "Support"}: + silhouette = """ + + + + + + """ + elif product_type in {"Microphone", "Headphones"}: + silhouette = """ + + + + + """ + elif product_type in {"Drone"}: + silhouette = """ + + + + + + + + + + """ + elif product_type in {"Laptop", "Monitor", "Monitor/Recorder"}: + silhouette = """ + + + + + """ + elif product_type in {"Printer", "Scanner"}: + silhouette = """ + + + + + """ + else: + silhouette = """ + + + + """ + + svg = f""" + + + + + + + + + + + + +B&H DEMO +{silhouette.format(accent=accent)} +{title[:34]} +{subtitle[:54]} +""" + path.write_text(svg, encoding="utf-8") + + +def ensure_misc_assets(base_dir: str) -> None: + images_dir = Path(base_dir) / "static" / "images" + ensure_svg(images_dir / "bh-photo-fallback.svg", "B&H Demo", "Deterministic local benchmark asset", "#24423f", "Monitor") + + +def spec_groups_from_sections(sections): + return [{"title": title, "rows": rows} for title, rows in sections] + + +def camera_specs(sensor, megapixels, mount, video, slots, burst, stabilization, battery, weight, autofocus, viewfinder): + return spec_groups_from_sections( + [ + ("Key Specs", [("Sensor Size", sensor), ("Effective Megapixels", f"{megapixels} MP"), ("Lens Mount", mount), ("Recording", video)]), + ("Performance", [("Card Slots", slots), ("Continuous Shooting", burst), ("Stabilization", stabilization), ("Autofocus", autofocus)]), + ("General", [("Battery Life", battery), ("Viewfinder", viewfinder), ("Weight", weight), ("Warranty", "1 Year Demo Warranty")]), + ] + ) + + +def lens_specs(mount, focal, aperture, filter_size, stabilization, close_focus, weight, construction): + bucket = "Wide" if "16-" in focal or "14-" in focal else "Telephoto" if "70-" in focal or "100-" in focal else "Standard" + return bucket, spec_groups_from_sections( + [ + ("Optics", [("Lens Mount", mount), ("Focal Length", focal), ("Maximum Aperture", aperture), ("Optical Design", construction)]), + ("Focus", [("Image Stabilization", stabilization), ("Minimum Focus Distance", close_focus), ("Filter Thread", filter_size), ("Autofocus Drive", "Linear motor")]), + ("Physical", [("Weather Resistance", "Dust and moisture sealed"), ("Weight", weight), ("Included Accessories", "Hood, caps, soft case"), ("Warranty", "1 Year Demo Warranty")]), + ] + ) + + +def cinema_specs(sensor, video, dynamic_range, media, inputs, weight, mount): + return spec_groups_from_sections( + [ + ("Capture", [("Sensor Size", sensor), ("Recording Formats", video), ("Dynamic Range", dynamic_range), ("Lens Mount", mount)]), + ("Workflow", [("Media Support", media), ("Audio Inputs", inputs), ("Monitoring", "5-inch daylight touchscreen"), ("Power", "NP-F or V-Mount compatible")]), + ("Physical", [("Body Style", "Production-ready compact cinema body"), ("Weight", weight), ("Warranty", "1 Year Demo Warranty"), ("Notes", "Synthetic local benchmark inventory")]), + ] + ) + + +def tripod_specs(material, payload, height, folded, head, weight): + return spec_groups_from_sections( + [ + ("Support", [("Material", material), ("Max Payload", payload), ("Max Height", height), ("Folded Length", folded)]), + ("Head", [("Head Type", head), ("Quick Release", "Arca-compatible"), ("Leg Sections", "4"), ("Feet", "Rubber and spike set")]), + ("General", [("Weight", weight), ("Warranty", "5 Year Demo Support"), ("Travel Bag", "Included"), ("Use Case", "Synthetic pickup-ready studio support")]), + ] + ) + + +def storage_specs(capacity, form_factor, read_speed, write_speed, interface, weight): + return spec_groups_from_sections( + [ + ("Media", [("Capacity", capacity), ("Form Factor", form_factor), ("Read Speed", read_speed), ("Write Speed", write_speed)]), + ("Workflow", [("Interface", interface), ("Capture Use", "Hybrid photo and video"), ("Warranty", "Limited lifetime demo coverage"), ("Ruggedization", "Shock and temperature resistant")]), + ("Physical", [("Weight", weight), ("Labeling", "Preformatted for deterministic mirror tasks"), ("Color", "Black / graphite"), ("Included", "Protective case or cable where applicable")]), + ] + ) + + +def lighting_specs(output, cct, cri, power, control, weight): + return spec_groups_from_sections( + [ + ("Light Engine", [("Output", output), ("Color Temperature", cct), ("CRI/TLCI", cri), ("Power Draw", power)]), + ("Control", [("Control Options", control), ("Effects", "Builtin lighting effects"), ("Cooling", "Low-noise active cooling"), ("Mount", "Bowens or yoke mount")]), + ("Physical", [("Weight", weight), ("Power Supply", "AC adapter included"), ("Warranty", "1 Year Demo Warranty"), ("Notes", "Local synthetic stock only")]), + ] + ) + + +def audio_specs(pattern, response, connectivity, power, weight, bundle_note): + return spec_groups_from_sections( + [ + ("Audio", [("Polar Pattern", pattern), ("Frequency Response", response), ("Connectivity", connectivity), ("Power", power)]), + ("Workflow", [("Monitoring", "3.5mm headphone monitoring"), ("Mounting", bundle_note), ("Compatibility", "Mac, Windows, iOS, and Android demo workflows"), ("Warranty", "2 Year Demo Warranty")]), + ("Physical", [("Weight", weight), ("Included", "Protective pouch and cables"), ("Finish", "Matte black"), ("Notes", "Synthetic local benchmark media gear")]), + ] + ) + + +def drone_specs(sensor, video, flight_time, avoidance, transmission, weight): + return spec_groups_from_sections( + [ + ("Flight", [("Sensor", sensor), ("Video", video), ("Max Flight Time", flight_time), ("Obstacle Avoidance", avoidance)]), + ("Control", [("Transmission", transmission), ("Storage", "Internal plus microSD"), ("Modes", "Follow, orbit, waypoint"), ("Battery", "Two-battery demo kit supported")]), + ("Physical", [("Weight", weight), ("Warranty", "1 Year Demo Warranty"), ("Notes", "No real flight or registration required"), ("Carrying Case", "Included in Fly More bundles")]), + ] + ) + + +def computer_specs(processor, memory, storage, display, ports, connectivity, weight): + return spec_groups_from_sections( + [ + ("Performance", [("Processor", processor), ("Memory", memory), ("Storage", storage), ("Display", display)]), + ("I/O", [("Ports", ports), ("Connectivity", connectivity), ("Color Management", "Factory calibration included"), ("Warranty", "1 Year Demo Warranty")]), + ("General", [("Weight", weight), ("Use Case", "Editing, ingest, and tethered capture"), ("OS", "Synthetic local benchmark image"), ("Notes", "No external activation required")]), + ] + ) + + +def monitor_specs(size, resolution, color, hdr, inputs, weight): + return spec_groups_from_sections( + [ + ("Display", [("Panel Size", size), ("Resolution", resolution), ("Color Coverage", color), ("HDR", hdr)]), + ("Connectivity", [("Inputs", inputs), ("Calibration", "Hardware LUT support"), ("USB Hub", "Integrated"), ("Warranty", "3 Year Demo Panel Coverage")]), + ("Physical", [("Weight", weight), ("Ergonomics", "Height, tilt, swivel"), ("Included", "Cables and shading hood where applicable"), ("Notes", "Synthetic creator monitor stock")]), + ] + ) + + +def printer_specs(media, resolution, speed, ink, connectivity, weight): + return spec_groups_from_sections( + [ + ("Output", [("Supported Media", media), ("Max Resolution", resolution), ("Print / Scan Speed", speed), ("Ink or Sensor", ink)]), + ("Connectivity", [("Connectivity", connectivity), ("Workflow", "Proofing and delivery"), ("Warranty", "1 Year Demo Warranty"), ("Notes", "Synthetic benchmark hardware")]), + ("Physical", [("Weight", weight), ("Included", "Starter supplies"), ("Footprint", "Studio desktop"), ("Support", "Local-only demo contact flow")]), + ] + ) + + +def make_product( + *, + name, + brand, + category_slug, + top_category_slug, + product_type, + short_description, + description, + price, + list_price, + rating, + review_count, + qa_count, + best_seller_rank, + sort_newness, + accent_color, + specs, + search_blob="", + condition="New", + availability="In Stock", + stock_level=14, + pickup_available=True, + pickup_message="Ready in 2 hours", + shipping_message="Free Expedited Shipping", + return_window="30-Day Return Window", + warranty="1 Year Demo Warranty", + product_family="", + sensor_size="", + mount_type="", + focal_length="", + focal_length_bucket="", + megapixels=0, + capacity_gb=0, + connectivity="", + release_label="Spring 2025", + featured=False, + bundle_anchor=False, + used_highlight=False, + variants=None, + deal_label="", + deal_type="sale", +): + slug = slugify(name) + sku = f"BH{best_seller_rank:05d}" + return { + "name": name, + "slug": slug, + "sku": sku, + "brand": brand, + "category_slug": category_slug, + "top_category_slug": top_category_slug, + "subcategory_slug": category_slug, + "product_type": product_type, + "product_family": product_family or category_slug, + "short_description": short_description, + "description": description, + "search_blob": search_blob, + "price": price, + "list_price": list_price, + "rating": rating, + "review_count": review_count, + "qa_count": qa_count, + "condition": condition, + "availability": availability, + "stock_level": stock_level, + "pickup_available": pickup_available, + "pickup_message": pickup_message, + "shipping_message": shipping_message, + "return_window": return_window, + "warranty": warranty, + "best_seller_rank": best_seller_rank, + "sort_newness": sort_newness, + "sensor_size": sensor_size, + "mount_type": mount_type, + "focal_length": focal_length, + "focal_length_bucket": focal_length_bucket, + "megapixels": megapixels, + "capacity_gb": capacity_gb, + "connectivity": connectivity, + "accent_color": accent_color, + "release_label": release_label, + "specs": specs, + "variants": variants or [], + "featured": featured, + "bundle_anchor": bundle_anchor, + "used_highlight": used_highlight, + "deal_label": deal_label, + "deal_type": deal_type, + } + + +def mirrorless_products(): + entries = [ + ("Sony Aurora A7X Mirrorless Camera", "Sony", 2498, 2798, 4.8, 188, "Full Frame", "Sony E", 33.0, "4K60 10-bit", "Dual CFexpress A / SD", "10 fps", "5-axis 7-stop IBIS", "610 shots", "673 g", "759k phase-detect", "3.69m-dot OLED EVF", True, True, "Free 2-day shipping"), + ("Canon Orbit R6 Mark II Mirrorless Camera", "Canon", 2299, 2499, 4.7, 164, "Full Frame", "Canon RF", 24.2, "4K60 oversampled", "Dual SD UHS-II", "12 fps mechanical", "5-axis 8-stop IBIS", "580 shots", "680 g", "Dual Pixel AF II", "3.69m-dot EVF", True, False, "Free expedited shipping"), + ("Nikon Zenith Z8 Mirrorless Camera", "Nikon", 3496, 3796, 4.9, 146, "Full Frame", "Nikon Z", 45.7, "8.3K60 RAW", "CFexpress B / SD", "20 fps RAW", "5-axis 6-stop VR", "530 shots", "910 g", "3D subject tracking", "3.69m-dot EVF", True, True, "Signature shipping included"), + ("Fujifilm Northlight X-T5 Mirrorless Camera", "Fujifilm", 1699, 1849, 4.8, 131, "APS-C", "Fujifilm X", 40.2, "6.2K30", "Dual SD UHS-II", "15 fps mechanical", "7-stop IBIS", "680 shots", "557 g", "Deep-learning AF", "3.69m-dot EVF", True, False, "Free 2-day shipping"), + ("Panasonic Lumix S5 II Mirrorless Camera", "Panasonic", 1997, 2197, 4.7, 119, "Full Frame", "L Mount", 24.2, "6K30 / 4K60", "Dual SD UHS-II", "9 fps mechanical", "5-axis 6.5-stop IBIS", "470 shots", "740 g", "Phase hybrid AF", "3.68m-dot OLED", True, False, "Free shipping"), + ("Sony Aurora A6700 Mirrorless Camera", "Sony", 1398, 1498, 4.7, 101, "APS-C", "Sony E", 26.0, "4K120", "Single SD UHS-II", "11 fps", "5-axis stabilization", "570 shots", "493 g", "AI subject recognition", "2.36m-dot OLED", True, False, "Fast creator shipping"), + ("Canon Orbit R8 Mirrorless Camera", "Canon", 1299, 1399, 4.6, 96, "Full Frame", "Canon RF", 24.2, "4K60", "Single SD UHS-II", "6 fps", "Digital stabilization", "420 shots", "461 g", "Dual Pixel AF II", "2.36m-dot EVF", True, False, "Free shipping"), + ("Nikon Zenith Zf Mirrorless Camera", "Nikon", 1896, 2046, 4.8, 88, "Full Frame", "Nikon Z", 24.5, "4K60", "Dual SD / microSD", "14 fps", "5-axis 8-stop VR", "410 shots", "710 g", "3D tracking", "3.69m-dot EVF", True, False, "Free expedited shipping"), + ("Fujifilm Northlight X-S20 Mirrorless Camera", "Fujifilm", 1299, 1399, 4.7, 82, "APS-C", "Fujifilm X", 26.1, "6.2K30", "Single SD UHS-II", "8 fps", "7-stop IBIS", "750 shots", "491 g", "Vlog-friendly AF", "2.36m-dot EVF", True, False, "Free shipping"), + ("Panasonic Lumix GH7 Mirrorless Camera", "Panasonic", 2197, 2397, 4.8, 76, "Micro Four Thirds", "MFT", 25.2, "5.7K60 ProRes", "CFexpress B / SD", "12 fps", "7.5-stop IBIS", "420 shots", "805 g", "Phase hybrid AF", "3.68m-dot OLED", True, False, "Pro video shipping"), + ("Sony Aurora A1C Mirrorless Camera", "Sony", 4498, 4798, 4.9, 65, "Full Frame", "Sony E", 50.1, "8K30 / 4K120", "Dual CFexpress A / SD", "30 fps", "5-axis 8-stop IBIS", "530 shots", "737 g", "AI subject recognition", "9.44m-dot EVF", True, True, "Priority insured shipping"), + ("Canon Orbit R50 V Mirrorless Camera", "Canon", 899, 999, 4.5, 73, "APS-C", "Canon RF", 24.2, "4K30", "Single SD UHS-II", "15 fps electronic", "Digital stabilization", "460 shots", "417 g", "Dual Pixel AF II", "2.36m-dot EVF", False, False, "Fast creator shipping"), + ] + records = [] + for idx, entry in enumerate(entries, start=1): + ( + name, brand, price, list_price, rating, review_count, sensor, mount, megapixels, video, slots, + burst, stabilization, battery, weight, autofocus, viewfinder, featured, bundle_anchor, ship_msg, + ) = entry + records.append( + make_product( + name=name, + brand=brand, + category_slug="mirrorless-cameras", + top_category_slug="photography", + product_type="Mirrorless Camera", + short_description="Hybrid mirrorless camera body for stills, creator video, and controlled studio work.", + description=f"{name} is part of the local B&H benchmark mirror. It combines responsive autofocus, dependable color, and pro-friendly media options for synthetic creator workflows.", + price=price, + list_price=list_price, + rating=rating, + review_count=review_count, + qa_count=9 + idx, + best_seller_rank=idx, + sort_newness=300 - idx, + accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), + specs=camera_specs(sensor, megapixels, mount, video, slots, burst, stabilization, battery, weight, autofocus, viewfinder), + search_blob=f"{brand} mirrorless {sensor} {mount} {video} creator camera photo video", + sensor_size=sensor, + mount_type=mount, + megapixels=megapixels, + connectivity="USB-C, HDMI, Wi-Fi, Bluetooth", + release_label="Spring 2025" if idx < 6 else "Fall 2024", + featured=featured, + bundle_anchor=bundle_anchor, + variants=[("Body Only", "Kit", "Body Only", 0), ("Creator Kit", "Kit", "Creator Kit", 299)], + deal_label="Deal Zone" if list_price > price else "", + ) + ) + return records + + +def dslr_products(start_rank): + entries = [ + ("Canon Terra 90D DSLR Camera", "Canon", 1149, 1299, 4.6, 118, 32.5, "Canon EF/EF-S", "4K30", "Single SD UHS-II", "10 fps", "Optical IS via lens", "1300 shots", "701 g"), + ("Nikon D780 Studio DSLR Camera", "Nikon", 1796, 1946, 4.7, 104, 24.5, "Nikon F", "4K30", "Dual SD UHS-II", "7 fps", "Optical VR via lens", "2260 shots", "840 g"), + ("Canon Terra Rebel T8 Creator DSLR", "Canon", 749, 829, 4.4, 92, 24.1, "Canon EF/EF-S", "4K24", "Single SD UHS-I", "7 fps", "Lens-based stabilization", "1240 shots", "515 g"), + ("Nikon D7500 Action DSLR", "Nikon", 896, 996, 4.6, 86, 20.9, "Nikon F", "4K30", "Single SD UHS-I", "8 fps", "Lens-based stabilization", "950 shots", "720 g"), + ("Canon Terra 5D Classic Refresh DSLR", "Canon", 1499, 1699, 4.5, 66, 30.4, "Canon EF", "4K30", "CF / SD dual", "7 fps", "Lens-based stabilization", "900 shots", "890 g"), + ("Nikon D850 Heritage DSLR", "Nikon", 2396, 2596, 4.8, 77, 45.7, "Nikon F", "4K30", "XQD / SD dual", "9 fps", "Lens-based stabilization", "1840 shots", "1005 g"), + ("Canon EOS 6D Mark Lite DSLR", "Canon", 999, 1129, 4.4, 59, 26.2, "Canon EF", "4K24", "Single SD UHS-I", "6.5 fps", "Lens-based stabilization", "1200 shots", "765 g"), + ("Nikon D5600 Travel DSLR", "Nikon", 699, 799, 4.3, 53, 24.2, "Nikon F", "Full HD", "Single SD UHS-I", "5 fps", "Lens-based stabilization", "970 shots", "465 g"), + ] + records = [] + for offset, entry in enumerate(entries): + name, brand, price, list_price, rating, review_count, mp, mount, video, slots, burst, stabilization, battery, weight = entry + records.append( + make_product( + name=name, + brand=brand, + category_slug="dslr-cameras", + top_category_slug="photography", + product_type="DSLR Camera", + short_description="Optical viewfinder camera body for still photography, event coverage, and classroom-friendly capture workflows.", + description=f"{name} mirrors a DSLR-focused B&H catalog entry with clear media, autofocus, and support notes for offline benchmark browsing.", + price=price, + list_price=list_price, + rating=rating, + review_count=review_count, + qa_count=6 + offset, + best_seller_rank=start_rank + offset, + sort_newness=250 - offset, + accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), + specs=camera_specs("APS-C" if mp < 25 else "Full Frame", mp, mount, video, slots, burst, stabilization, battery, weight, "Optical phase AF", "Optical pentaprism"), + search_blob=f"{brand} dslr optical viewfinder {mount} photography camera", + sensor_size="APS-C" if mp < 25 else "Full Frame", + mount_type=mount, + megapixels=mp, + connectivity="USB, HDMI, Wi-Fi", + release_label="Heritage Stock", + variants=[("Body Only", "Kit", "Body Only", 0), ("Starter Lens Kit", "Kit", "Starter Lens Kit", 179)], + deal_label="Photo Special" if price < list_price else "", + ) + ) + return records + + +def lens_products(start_rank): + entries = [ + ("Sigma ArtLine 24-70mm f/2.8 DG DN Lens", "Sigma", "Sony E", 1099, 1199, 4.8, 142, "24-70mm", "f/2.8", "82mm", "Optical stabilization", "0.18 m", "835 g", "19 elements in 15 groups", "Standard", "New"), + ("Tamron Travel 70-180mm f/2.8 Di III Lens", "Tamron", "Sony E", 1099, 1179, 4.7, 124, "70-180mm", "f/2.8", "67mm", "VC stabilization", "0.85 m", "810 g", "19 elements in 14 groups", "Telephoto", "New"), + ("Sony GM 16-35mm f/2.8 II Lens", "Sony", "Sony E", 2098, 2298, 4.9, 97, "16-35mm", "f/2.8", "82mm", "No optical stabilization", "0.22 m", "547 g", "15 elements in 12 groups", "Wide", "New"), + ("Canon RF 100-500mm f/4.5-7.1L Lens", "Canon", "Canon RF", 2699, 2899, 4.8, 93, "100-500mm", "f/4.5-7.1", "77mm", "Optical stabilization", "0.9 m", "1365 g", "20 elements in 14 groups", "Telephoto", "New"), + ("Nikon Z 24-120mm f/4 S Lens", "Nikon", "Nikon Z", 1096, 1196, 4.8, 88, "24-120mm", "f/4", "77mm", "No optical stabilization", "0.35 m", "630 g", "16 elements in 13 groups", "Standard", "New"), + ("Fujifilm XF 33mm f/1.4 R LM Lens", "Fujifilm", "Fujifilm X", 799, 899, 4.7, 82, "33mm", "f/1.4", "58mm", "No optical stabilization", "0.3 m", "360 g", "15 elements in 10 groups", "Standard", "New"), + ("Sigma ArtLine 85mm f/1.4 DG DN Lens", "Sigma", "Sony E", 999, 1099, 4.8, 75, "85mm", "f/1.4", "77mm", "No optical stabilization", "0.85 m", "625 g", "15 elements in 11 groups", "Telephoto", "Open-Box"), + ("Tamron Travel 28-75mm f/2.8 G2 Lens", "Tamron", "Sony E", 799, 899, 4.6, 120, "28-75mm", "f/2.8", "67mm", "No optical stabilization", "0.18 m", "540 g", "17 elements in 15 groups", "Standard", "New"), + ("Sony PZ 16-35mm f/4 G Lens", "Sony", "Sony E", 1198, 1298, 4.7, 71, "16-35mm", "f/4", "72mm", "Power zoom stabilization", "0.24 m", "353 g", "13 elements in 12 groups", "Wide", "New"), + ("Canon RF 24-105mm f/4L IS Lens", "Canon", "Canon RF", 1299, 1399, 4.7, 116, "24-105mm", "f/4", "77mm", "Optical stabilization", "0.45 m", "700 g", "18 elements in 14 groups", "Standard", "New"), + ("Nikon Z 70-200mm f/2.8 VR S Lens", "Nikon", "Nikon Z", 2396, 2496, 4.9, 68, "70-200mm", "f/2.8", "77mm", "VR stabilization", "0.5 m", "1360 g", "21 elements in 18 groups", "Telephoto", "New"), + ("Fujifilm XF 16-55mm f/2.8 WR II Lens", "Fujifilm", "Fujifilm X", 1249, 1349, 4.8, 59, "16-55mm", "f/2.8", "72mm", "No optical stabilization", "0.3 m", "660 g", "15 elements in 11 groups", "Wide", "New"), + ("Sigma Contemporary 18-50mm f/2.8 DC DN Lens", "Sigma", "Fujifilm X", 549, 629, 4.6, 64, "18-50mm", "f/2.8", "55mm", "No optical stabilization", "0.12 m", "285 g", "13 elements in 10 groups", "Wide", "Used"), + ("Tamron 17-70mm f/2.8 VC Lens", "Tamron", "Fujifilm X", 749, 849, 4.7, 66, "17-70mm", "f/2.8", "67mm", "VC stabilization", "0.19 m", "525 g", "16 elements in 12 groups", "Standard", "New"), + ("Sony FE 70-300mm f/4.5-5.6 G Lens", "Sony", "Sony E", 1248, 1348, 4.5, 52, "70-300mm", "f/4.5-5.6", "72mm", "Optical stabilization", "0.9 m", "854 g", "16 elements in 13 groups", "Telephoto", "Open-Box"), + ("Canon RF 35mm f/1.8 Macro IS Lens", "Canon", "Canon RF", 479, 549, 4.6, 97, "35mm", "f/1.8", "52mm", "Optical stabilization", "0.17 m", "305 g", "11 elements in 9 groups", "Standard", "New"), + ("Nikon Z 14-30mm f/4 S Lens", "Nikon", "Nikon Z", 1196, 1296, 4.8, 57, "14-30mm", "f/4", "82mm", "No optical stabilization", "0.28 m", "485 g", "14 elements in 12 groups", "Wide", "New"), + ("Panasonic Lumix 24-105mm f/4 Macro Lens", "Panasonic", "L Mount", 998, 1098, 4.6, 54, "24-105mm", "f/4", "77mm", "Optical stabilization", "0.3 m", "680 g", "16 elements in 13 groups", "Standard", "New"), + ("Sigma Sports 150-600mm f/5-6.3 DG DN Lens", "Sigma", "Sony E", 1499, 1599, 4.7, 49, "150-600mm", "f/5-6.3", "95mm", "Optical stabilization", "0.58 m", "2100 g", "25 elements in 15 groups", "Telephoto", "Used"), + ("Canon RF 16mm f/2.8 STM Lens", "Canon", "Canon RF", 279, 329, 4.4, 88, "16mm", "f/2.8", "43mm", "No optical stabilization", "0.13 m", "165 g", "9 elements in 7 groups", "Wide", "New"), + ("Sony FE 40mm f/2.5 G Lens", "Sony", "Sony E", 548, 598, 4.6, 46, "40mm", "f/2.5", "49mm", "No optical stabilization", "0.28 m", "173 g", "9 elements in 9 groups", "Standard", "Open-Box"), + ("Nikon Z 50mm f/1.8 S Lens", "Nikon", "Nikon Z", 526, 576, 4.8, 63, "50mm", "f/1.8", "62mm", "No optical stabilization", "0.4 m", "415 g", "12 elements in 9 groups", "Standard", "New"), + ("Tamron 150-500mm f/5-6.7 Di III VC Lens", "Tamron", "Sony E", 1299, 1399, 4.7, 43, "150-500mm", "f/5-6.7", "82mm", "VC stabilization", "0.6 m", "1725 g", "25 elements in 16 groups", "Telephoto", "New"), + ("Fujifilm XF 70-300mm f/4-5.6 OIS Lens", "Fujifilm", "Fujifilm X", 749, 829, 4.7, 58, "70-300mm", "f/4-5.6", "67mm", "Optical stabilization", "0.83 m", "580 g", "17 elements in 12 groups", "Telephoto", "New"), + ] + records = [] + for offset, entry in enumerate(entries): + ( + name, brand, mount, price, list_price, rating, review_count, focal, aperture, filter_size, + stabilization, close_focus, weight, construction, bucket, condition, + ) = entry + focal_bucket, specs = lens_specs(mount, focal, aperture, filter_size, stabilization, close_focus, weight, construction) + records.append( + make_product( + name=name, + brand=brand, + category_slug="camera-lenses", + top_category_slug="photography", + product_type="Lens", + short_description="Fast interchangeable lens with category-specific optical specs and comparison-friendly rows.", + description=f"{name} appears in the local B&H Photo mirror with focal length, stabilization, and compatibility details grounded in deterministic demo data.", + price=price, + list_price=list_price, + rating=rating, + review_count=review_count, + qa_count=7 + (offset % 6), + best_seller_rank=start_rank + offset, + sort_newness=220 - offset, + accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), + specs=specs, + search_blob=f"{brand} lens {mount} {focal} {aperture} {bucket.lower()} photography", + mount_type=mount, + focal_length=focal, + focal_length_bucket=focal_bucket, + connectivity="None", + condition=condition, + availability="In Stock" if condition != "Used" else "Limited Stock", + stock_level=6 if condition != "Used" else 2, + pickup_message="Ready today" if condition == "New" else "Ready tomorrow", + shipping_message="Insured lens delivery", + warranty="1 Year Demo Optics Coverage", + release_label="Spring 2024", + variants=[("Standard Finish", "Finish", "Standard Finish", 0), ("Protection Filter Bundle", "Bundle", "Protection Filter Bundle", 39)], + deal_label="Open-Box" if condition == "Open-Box" else ("Used Deal" if condition == "Used" else "Lens Sale"), + deal_type="open-box" if condition == "Open-Box" else ("used" if condition == "Used" else "sale"), + used_highlight=condition != "New", + ) + ) + return records + + +def cinema_products(start_rank): + entries = [ + ("Blackmagic Scout 6K Pro Cinema Camera", "Blackmagic", 2495, 2695, 4.8, 79, "Super 35", "6K Open Gate / 4K120", "13 stops", "CFexpress / USB-C SSD", "Mini XLR dual", "900 g", "Canon EF", True), + ("Panasonic EVA Core 6K Cinema Camera", "Panasonic", 3299, 3499, 4.7, 51, "Full Frame", "6K60 / 4K120", "14+ stops", "CFexpress B / SD", "Mini XLR dual", "1200 g", "L Mount", True), + ("Sony FX3 Creator Cinema Camera", "Sony", 3898, 4098, 4.9, 102, "Full Frame", "4K120", "15+ stops", "CFexpress A / SD", "XLR handle included", "715 g", "Sony E", True), + ("Canon C70 Motion Cinema Camera", "Canon", 4799, 4999, 4.8, 70, "Super 35 DGO", "4K120", "16+ stops", "Dual SD UHS-II", "Mini XLR dual", "1170 g", "Canon RF", True), + ("Blackmagic Pocket Forge 4K Cinema Camera", "Blackmagic", 1295, 1395, 4.6, 95, "Micro Four Thirds", "4K60", "13 stops", "CFast 2.0 / SD UHS-II", "Mini XLR", "722 g", "MFT", False), + ("Panasonic BoxCam BGH2 Pro Cinema Camera", "Panasonic", 1697, 1797, 4.5, 48, "Micro Four Thirds", "4K60", "13+ stops", "SD UHS-II", "3.5mm stereo", "545 g", "MFT", False), + ("Sony FX30 Studio Cinema Camera", "Sony", 1798, 1898, 4.8, 81, "APS-C", "4K120", "14+ stops", "CFexpress A / SD", "XLR via handle", "646 g", "Sony E", True), + ("Canon R5 C Motion Cinema Camera", "Canon", 3799, 3999, 4.7, 58, "Full Frame", "8K60 RAW", "14+ stops", "CFexpress B / SD", "3.5mm + digital hot shoe", "680 g", "Canon RF", True), + ("Blackmagic Studio Rack 12K Cinema Camera", "Blackmagic", 5995, 6295, 4.9, 35, "Full Frame", "12K60 RAW", "16 stops", "Dual CFexpress", "Mini XLR quad", "1800 g", "PL Mount", False), + ("Sony VENI Micro Cinema Unit", "Sony", 6995, 7295, 4.8, 27, "Full Frame", "6K60 / 4K120", "15+ stops", "CFexpress A", "XLR via adapter", "1350 g", "Sony E", False), + ] + records = [] + for offset, entry in enumerate(entries): + name, brand, price, list_price, rating, review_count, sensor, video, dynamic_range, media, inputs, weight, mount, pickup = entry + records.append( + make_product( + name=name, + brand=brand, + category_slug="cinema-cameras", + top_category_slug="video", + product_type="Cinema Camera", + short_description="Compact or production-ready cinema body with media, audio, and DR specs surfaced for comparison tasks.", + description=f"{name} is mirrored as a deterministic B&H pro video listing with no live services, no firmware checks, and no outside rental or reservation APIs.", + price=price, + list_price=list_price, + rating=rating, + review_count=review_count, + qa_count=8 + offset, + best_seller_rank=start_rank + offset, + sort_newness=200 - offset, + accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), + specs=cinema_specs(sensor, video, dynamic_range, media, inputs, weight, mount), + search_blob=f"{brand} cinema camera {sensor} {video} {mount}", + sensor_size=sensor, + mount_type=mount, + connectivity="USB-C, HDMI, Timecode", + availability="In Stock" if pickup else "Pre-Order", + stock_level=5 if pickup else 0, + pickup_available=pickup, + pickup_message="Pickup at flagship stores" if pickup else "Reserve for first shipment", + shipping_message="Signature video delivery", + release_label="Summer 2025", + bundle_anchor=offset < 4, + variants=[("Body Only", "Kit", "Body Only", 0), ("Production Bundle", "Kit", "Production Bundle", 499)], + deal_label="Video Event", + ) + ) + return records + + +def support_products(start_rank): + entries = [ + ("Manfrotto Carbon Travel Tripod Pro", "Manfrotto", 399, 469, 4.7, 94, "Carbon Fiber", "18 lb", "61.8 in", "17.3 in", "Ball Head", "3.2 lb"), + ("Benro Aero Video Tripod 8X", "Benro", 349, 399, 4.6, 71, "Aluminum", "13.2 lb", "65.1 in", "30.5 in", "Fluid Head", "5.1 lb"), + ("Peak Design Travel Support Carbon", "Peak Design", 599, 649, 4.8, 85, "Carbon Fiber", "20 lb", "60.2 in", "15.4 in", "Ball Head", "2.8 lb"), + ("Manfrotto Studio 055 Column Tripod", "Manfrotto", 289, 329, 4.5, 63, "Aluminum", "19.8 lb", "67.2 in", "25.6 in", "Column Head", "5.4 lb"), + ("Benro Slim Photo Tripod Kit", "Benro", 149, 179, 4.4, 58, "Aluminum", "8.8 lb", "57.5 in", "20.7 in", "Ball Head", "2.9 lb"), + ("Peak Design Mobile Creator Stand", "Peak Design", 119, 139, 4.3, 49, "Aluminum", "6 lb", "18.3 in", "11.0 in", "Phone Clamp", "1.2 lb"), + ("Manfrotto Nano Light Stand Duo", "Manfrotto", 99, 119, 4.4, 55, "Aluminum", "3 lb", "73.0 in", "19.0 in", "Stud Mount", "2.1 lb"), + ("Benro Hydra Adventure Tripod", "Benro", 279, 319, 4.6, 42, "Carbon Fiber", "15.4 lb", "60.1 in", "15.0 in", "Ball Head", "3.4 lb"), + ("Peak Design Everyday Sling 10L", "Peak Design", 149, 169, 4.7, 88, "Weatherproof Nylon", "10L carry", "n/a", "n/a", "Carry System", "1.9 lb"), + ("Manfrotto One-Step Monopod Pro", "Manfrotto", 189, 229, 4.5, 39, "Carbon Fiber", "15 lb", "63.0 in", "21.0 in", "Monopod Foot", "2.4 lb"), + ] + records = [] + for offset, entry in enumerate(entries): + name, brand, price, list_price, rating, review_count, material, payload, height, folded, head, weight = entry + product_type = "Support" if "Sling" in name else "Tripod" + specs = tripod_specs(material, payload, height, folded, head, weight) + records.append( + make_product( + name=name, + brand=brand, + category_slug="tripods-supports", + top_category_slug="photography", + product_type=product_type, + short_description="Support or carry solution with payload, travel, and pickup details surfaced for quick comparison.", + description=f"{name} is a deterministic support listing used for benchmark tasks around payload, travel size, and pickup availability.", + price=price, + list_price=list_price, + rating=rating, + review_count=review_count, + qa_count=4 + offset, + best_seller_rank=start_rank + offset, + sort_newness=180 - offset, + accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), + specs=specs, + search_blob=f"{brand} support tripod bag payload travel creator", + connectivity="None", + availability="In Stock" if offset < 8 else "Limited Stock", + stock_level=9 - (offset % 4), + pickup_message="Ready in 90 minutes", + shipping_message="Oversize support shipping" if "Studio" in name else "Free shipping", + release_label="Creator Support 2025", + deal_label="Support Sale", + used_highlight="Sling" in name, + condition="Used" if "Sling" in name else "New", + ) + ) + return records + + +def storage_products(start_rank): + entries = [ + ("SanDisk Pro Cinema CFexpress Type B 512GB Card", "SanDisk", 279, 319, 4.8, 147, 512, "Card", "1700 MB/s", "1400 MB/s", "CFexpress Type B", "0.03 lb", "New"), + ("Lexar Gold SDXC 256GB V90 Card", "Lexar", 199, 229, 4.7, 134, 256, "Card", "300 MB/s", "260 MB/s", "SDXC UHS-II", "0.01 lb", "New"), + ("SanDisk Extreme Portable SSD 2TB", "SanDisk", 189, 219, 4.7, 121, 2048, "Portable SSD", "1050 MB/s", "1000 MB/s", "USB-C 3.2 Gen 2", "0.17 lb", "New"), + ("Lexar Workflow Dock 4-Bay", "Lexar", 139, 159, 4.5, 76, 0, "Workflow Dock", "n/a", "n/a", "USB-C Dock", "1.5 lb", "New"), + ("SanDisk Ultra Luxe SDXC 128GB Card", "SanDisk", 39, 49, 4.4, 112, 128, "Card", "150 MB/s", "90 MB/s", "SDXC UHS-I", "0.01 lb", "New"), + ("Lexar Armor Gold CFexpress 1TB Card", "Lexar", 389, 419, 4.8, 64, 1024, "Card", "1900 MB/s", "1500 MB/s", "CFexpress Type B", "0.03 lb", "New"), + ("SanDisk ProBlade 4TB SSD Mag", "SanDisk", 349, 399, 4.6, 41, 4096, "SSD Mag", "2000 MB/s", "2000 MB/s", "USB-C Blade", "0.25 lb", "Open-Box"), + ("Lexar Pro Go Portable SSD 1TB", "Lexar", 119, 139, 4.5, 52, 1024, "Portable SSD", "1050 MB/s", "1000 MB/s", "USB-C 3.2 Gen 2", "0.2 lb", "New"), + ("SanDisk Creator microSD 512GB Card", "SanDisk", 69, 79, 4.4, 87, 512, "Card", "190 MB/s", "130 MB/s", "microSD UHS-I", "0.01 lb", "New"), + ("Lexar Silver SDXC 512GB Card", "Lexar", 69, 79, 4.3, 60, 512, "Card", "205 MB/s", "140 MB/s", "SDXC UHS-I", "0.01 lb", "Used"), + ("SanDisk Rugged Studio SSD 4TB", "SanDisk", 499, 549, 4.7, 34, 4096, "Desktop SSD", "3000 MB/s", "2500 MB/s", "Thunderbolt 4", "1.8 lb", "New"), + ("Lexar Capture Hub Reader", "Lexar", 79, 89, 4.2, 29, 0, "Card Reader", "n/a", "n/a", "USB-C Reader", "0.25 lb", "New"), + ] + records = [] + for offset, entry in enumerate(entries): + name, brand, price, list_price, rating, review_count, capacity_gb, form_factor, read_speed, write_speed, interface, weight, condition = entry + records.append( + make_product( + name=name, + brand=brand, + category_slug="memory-cards-storage", + top_category_slug="photography", + product_type="Storage", + short_description="Capture media or SSD workflow hardware with capacity, speed, and interface filters baked in.", + description=f"{name} is mirrored as deterministic media inventory with readable throughput specs and creator workflow metadata.", + price=price, + list_price=list_price, + rating=rating, + review_count=review_count, + qa_count=5 + offset, + best_seller_rank=start_rank + offset, + sort_newness=160 - offset, + accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), + specs=storage_specs(f"{capacity_gb} GB" if capacity_gb and capacity_gb < 1024 else (f"{capacity_gb // 1024} TB" if capacity_gb else "Accessory"), form_factor, read_speed, write_speed, interface, weight), + search_blob=f"{brand} storage media {form_factor} {capacity_gb}gb {interface}", + capacity_gb=capacity_gb, + connectivity=interface, + availability="In Stock" if condition == "New" else "Limited Stock", + stock_level=8 if condition == "New" else 2, + pickup_message="Ready in 1 hour", + shipping_message="Free media shipping", + release_label="Workflow 2025", + condition=condition, + used_highlight=condition != "New", + deal_label="Storage Deal" if condition == "New" else condition, + deal_type="sale" if condition == "New" else condition.lower(), + ) + ) + return records + + +def lighting_products(start_rank): + entries = [ + ("Aputure Storm 300x Bi-Color LED", "Aputure", 949, 1049, 4.8, 96, "58,000 lux at 1m", "2700-6500K", "CRI 96 / TLCI 97", "300W", "Sidus Link app, DMX, onboard", "6.4 lb"), + ("Godox LiteMax 200 RGB Fixture", "Godox", 499, 569, 4.6, 72, "26,000 lux at 1m", "2800-10,000K RGB", "CRI 95 / TLCI 95", "200W", "Bluetooth app, onboard", "4.8 lb"), + ("Aputure Nova Slim 1x1 Panel", "Aputure", 699, 779, 4.7, 58, "18,000 lux at 1m", "2700-6500K", "CRI 96 / TLCI 97", "200W", "Sidus Link app, DMX, CRMX", "7.5 lb"), + ("Godox FlexBeam 100 Portable LED", "Godox", 229, 259, 4.5, 63, "8,500 lux at 1m", "2700-6500K", "CRI 96 / TLCI 96", "100W", "App control, onboard", "2.8 lb"), + ("Aputure Infinibar 4-Light Kit", "Aputure", 1129, 1249, 4.8, 41, "RGB pixel bar set", "2000-10,000K", "CRI 95 / TLCI 98", "400W total", "App control, DMX, CRMX", "12.0 lb"), + ("Godox SL150III Daylight Monolight", "Godox", 329, 369, 4.4, 74, "74,300 lux at 1m", "5600K", "CRI 96 / TLCI 97", "160W", "App control, onboard", "4.2 lb"), + ("Aputure MC Pro Pocket RGB Light", "Aputure", 199, 229, 4.6, 83, "Pocket accent light", "2000-10,000K", "CRI 96 / TLCI 97", "5W", "App control", "0.6 lb"), + ("Godox TubeFlow RGB Pair", "Godox", 279, 319, 4.5, 34, "RGB tube pair", "2700-8500K", "CRI 95 / TLCI 96", "50W total", "App control", "2.4 lb"), + ("Aputure Fresnel 2x Modifier", "Aputure", 149, 169, 4.6, 44, "Modifier", "n/a", "n/a", "Passive", "Manual focus beam", "2.1 lb"), + ("Godox Lantern Dome Softbox 65cm", "Godox", 89, 99, 4.3, 57, "Modifier", "n/a", "n/a", "Passive", "Quick-release mount", "1.8 lb"), + ("Aputure Amaran 150c RGB Monolight", "Aputure", 359, 399, 4.6, 52, "15,610 lux at 1m", "2500-7500K RGB", "CRI 95 / TLCI 96", "180W", "App control, onboard", "6.0 lb"), + ("Godox Knowled M300Bi", "Godox", 879, 949, 4.7, 29, "85,700 lux at 1m", "2800-6500K", "CRI 97 / TLCI 98", "330W", "App, DMX, CRMX", "7.4 lb"), + ] + records = [] + for offset, entry in enumerate(entries): + name, brand, price, list_price, rating, review_count, output, cct, cri, power, control, weight = entry + product_type = "Lighting" + records.append( + make_product( + name=name, + brand=brand, + category_slug="lighting-kits", + top_category_slug="lighting", + product_type=product_type, + short_description="Lighting fixture or modifier with output, color, and control specs surfaced for studio shopping tasks.", + description=f"{name} appears in the local mirror with enough tech detail to compare output, control options, and bundle readiness without contacting any live vendor system.", + price=price, + list_price=list_price, + rating=rating, + review_count=review_count, + qa_count=4 + offset, + best_seller_rank=start_rank + offset, + sort_newness=140 - offset, + accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), + specs=lighting_specs(output, cct, cri, power, control, weight), + search_blob=f"{brand} lighting led rgb bi-color output app control", + connectivity="Bluetooth, DMX" if "DMX" in control else "Bluetooth", + availability="In Stock", + stock_level=8, + pickup_message="Pickup ready by afternoon", + shipping_message="Studio gear shipping", + release_label="Studio Light 2025", + featured=offset < 2, + deal_label="Lighting Event", + ) + ) + return records + + +def microphone_products(start_rank): + entries = [ + ("Rode Wireless Creator Duo", "Rode", 299, 329, 4.8, 155, "Omnidirectional", "20 Hz - 20 kHz", "2.4 GHz, USB-C, 3.5mm", "Internal battery", "0.3 lb", "Dual transmitter kit"), + ("DJI Mic Air 2TX Kit", "DJI", 349, 379, 4.7, 101, "Omnidirectional", "50 Hz - 20 kHz", "2.4 GHz, USB-C, Lightning", "Internal battery", "0.35 lb", "Dual transmitter kit"), + ("Shure MVX2 USB Stream Mic", "Shure", 229, 249, 4.6, 88, "Cardioid", "50 Hz - 16 kHz", "USB-C, 3.5mm", "USB bus power", "0.9 lb", "Desktop yoke mount"), + ("Rode NTG Creator Shotgun", "Rode", 249, 279, 4.6, 65, "Supercardioid", "20 Hz - 20 kHz", "XLR, 3.5mm", "Phantom / internal battery", "0.55 lb", "Cold-shoe mount"), + ("Sennheiser MKE Field 600 Shotgun", "Sennheiser", 329, 359, 4.7, 54, "Supercardioid", "40 Hz - 20 kHz", "XLR", "Phantom power", "0.6 lb", "Shock mount included"), + ("Shure MV7X Voice Broadcast Mic", "Shure", 179, 199, 4.6, 119, "Cardioid", "50 Hz - 16 kHz", "XLR", "Passive", "1.2 lb", "Desktop or boom mount"), + ("Rode PodMic USB Dynamic Mic", "Rode", 199, 219, 4.7, 82, "Cardioid", "20 Hz - 20 kHz", "USB-C, XLR", "USB bus / XLR", "2.0 lb", "Boom or desk mount"), + ("DJI Pocket Interview Mic", "DJI", 149, 169, 4.5, 39, "Cardioid", "50 Hz - 18 kHz", "USB-C", "Rechargeable", "0.2 lb", "Handheld interview kit"), + ("Sennheiser Profile USB Mic", "Sennheiser", 149, 169, 4.5, 61, "Cardioid", "20 Hz - 20 kHz", "USB-C", "USB bus power", "0.77 lb", "Desk stand included"), + ("Shure MoveMic Reporter Kit", "Shure", 269, 299, 4.4, 28, "Omnidirectional", "50 Hz - 18 kHz", "Bluetooth, USB-C", "Internal battery", "0.42 lb", "Mobile reporter kit"), + ("Rode Streamer Lavalier Twin", "Rode", 189, 209, 4.4, 31, "Omnidirectional", "20 Hz - 20 kHz", "USB-C adapter", "Plug-in power", "0.18 lb", "Dual clip-on set"), + ("Sennheiser Accent Podcast Pack", "Sennheiser", 399, 429, 4.6, 26, "Cardioid", "50 Hz - 16 kHz", "USB interface, XLR", "USB + phantom", "2.5 lb", "Interface plus mic bundle"), + ] + records = [] + for offset, entry in enumerate(entries): + name, brand, price, list_price, rating, review_count, pattern, response, connectivity, power, weight, bundle_note = entry + records.append( + make_product( + name=name, + brand=brand, + category_slug="microphones", + top_category_slug="audio", + product_type="Microphone", + short_description="Microphone or wireless capture kit with connectivity and monitoring data ready for compare and Q&A tasks.", + description=f"{name} mirrors an audio-focused B&H listing with demo-only purchasing, local pickup, and no real device activation flow.", + price=price, + list_price=list_price, + rating=rating, + review_count=review_count, + qa_count=6 + offset, + best_seller_rank=start_rank + offset, + sort_newness=120 - offset, + accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), + specs=audio_specs(pattern, response, connectivity, power, weight, bundle_note), + search_blob=f"{brand} microphone wireless usb xlr creator audio", + connectivity=connectivity, + availability="In Stock", + stock_level=11 - (offset % 4), + pickup_message="Ready at audio desks", + shipping_message="Free audio shipping", + release_label="Audio 2025", + featured=offset < 2, + deal_label="Audio Special", + ) + ) + return records + + +def headphone_products(start_rank): + entries = [ + ("Sennheiser HD 490 Pro Reference Headphones", "Sennheiser", 399, 429, 4.8, 68, "Open-back", "5 Hz - 36 kHz", "Wired 3.5mm / 1/4in", "Passive", "0.72 lb", "Reference mixing"), + ("Sony Studio MDR-M1 Headphones", "Sony", 249, 279, 4.6, 57, "Closed-back", "5 Hz - 80 kHz", "Wired 3.5mm / 1/4in", "Passive", "0.55 lb", "Recording and monitoring"), + ("Sennheiser HD 280 Broadcast Headphones", "Sennheiser", 99, 119, 4.5, 122, "Closed-back", "8 Hz - 25 kHz", "Wired 3.5mm / 1/4in", "Passive", "0.63 lb", "Tracking"), + ("Sony Monitor ZX Pro Headphones", "Sony", 129, 149, 4.4, 74, "Closed-back", "10 Hz - 40 kHz", "Wired 3.5mm", "Passive", "0.47 lb", "Creator desk monitoring"), + ("Sennheiser Accent BT Creator Headset", "Sennheiser", 229, 249, 4.3, 43, "Closed-back", "18 Hz - 22 kHz", "Bluetooth 5.3, USB-C", "Internal battery", "0.62 lb", "Portable editing"), + ("Sony OpenMix Spatial Headphones", "Sony", 299, 329, 4.5, 28, "Open-back", "8 Hz - 50 kHz", "Wired and USB-C DAC", "Passive", "0.59 lb", "Spatial reference"), + ("Sennheiser FieldFold On-Ear Headphones", "Sennheiser", 89, 99, 4.2, 31, "On-ear", "20 Hz - 20 kHz", "Wired 3.5mm", "Passive", "0.36 lb", "Compact field kit"), + ("Sony Creator ANC Monitor Headphones", "Sony", 349, 379, 4.6, 36, "Closed-back ANC", "10 Hz - 30 kHz", "Bluetooth 5.2, 3.5mm, USB-C", "Internal battery", "0.64 lb", "Travel and edit"), + ] + records = [] + for offset, entry in enumerate(entries): + name, brand, price, list_price, rating, review_count, pattern, response, connectivity, power, weight, bundle_note = entry + records.append( + make_product( + name=name, + brand=brand, + category_slug="headphones", + top_category_slug="audio", + product_type="Headphones", + short_description="Monitoring headphones with connection, isolation, and workflow notes suitable for side-by-side comparison tasks.", + description=f"{name} is a deterministic audio monitoring product in the local B&H mirror with pickup badges and no live warranty lookup.", + price=price, + list_price=list_price, + rating=rating, + review_count=review_count, + qa_count=3 + offset, + best_seller_rank=start_rank + offset, + sort_newness=105 - offset, + accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), + specs=audio_specs(pattern, response, connectivity, power, weight, bundle_note), + search_blob=f"{brand} headphones monitor {connectivity} studio", + connectivity=connectivity, + availability="In Stock", + stock_level=10, + pickup_message="Ready today", + shipping_message="Free shipping", + release_label="Monitoring 2025", + deal_label="Audio Special", + ) + ) + return records + + +def drone_products(start_rank): + entries = [ + ("DJI Airframe 4S Fly More Drone", "DJI", 1399, 1499, 4.8, 92, "1-inch CMOS", "5.4K60", "46 min", "Omnidirectional", "O4 transmission", "1.58 lb"), + ("DJI Neo Cinema Mini Drone", "DJI", 699, 749, 4.5, 81, "1/1.3-inch CMOS", "4K60 vertical", "31 min", "Forward / downward", "O4 Lite", "0.54 lb"), + ("DJI Inspire Mini Pro Drone", "DJI", 2199, 2399, 4.7, 49, "4/3 CMOS", "6K30", "38 min", "Omnidirectional", "O4 transmission", "2.4 lb"), + ("DJI Adventure FPV Combo", "DJI", 999, 1099, 4.4, 36, "1/1.7-inch CMOS", "4K120", "22 min", "Forward sensing", "Low-latency FPV", "1.7 lb"), + ("DJI Mini Air Travel Drone", "DJI", 499, 549, 4.4, 77, "1/1.3-inch CMOS", "4K30", "34 min", "Tri-directional", "O3 transmission", "0.55 lb"), + ("DJI Mavic Survey Drone", "DJI", 1899, 1999, 4.6, 28, "4/3 CMOS", "5.1K50", "43 min", "Omnidirectional", "O4 transmission", "2.0 lb"), + ("DJI Pocket FPV Neo", "DJI", 399, 449, 4.2, 24, "1/2-inch CMOS", "4K30", "18 min", "Downward", "FPV transmission", "0.46 lb"), + ("DJI Creator Airframe SE", "DJI", 849, 899, 4.5, 31, "1-inch CMOS", "4K60", "39 min", "Forward / backward", "O4 Lite", "0.95 lb"), + ] + records = [] + for offset, entry in enumerate(entries): + name, brand, price, list_price, rating, review_count, sensor, video, flight_time, avoidance, transmission, weight = entry + records.append( + make_product( + name=name, + brand=brand, + category_slug="drones", + top_category_slug="video", + product_type="Drone", + short_description="Aerial creator platform with flight time, sensing, and transmission rows designed for filter and comparison tasks.", + description=f"{name} is part of the local benchmark catalog and never connects to live flight services, geofencing, or registration systems.", + price=price, + list_price=list_price, + rating=rating, + review_count=review_count, + qa_count=7 + offset, + best_seller_rank=start_rank + offset, + sort_newness=92 - offset, + accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), + specs=drone_specs(sensor, video, flight_time, avoidance, transmission, weight), + search_blob=f"{brand} drone aerial {video} {sensor} creator", + connectivity=transmission, + availability="In Stock" if offset < 6 else "Limited Stock", + stock_level=4 if offset < 6 else 1, + pickup_message="Pickup by end of day", + shipping_message="Adult signature shipping", + release_label="Aerial 2025", + featured=offset < 2, + deal_label="Drone Event", + ) + ) + return records + + +def monitor_recorder_products(start_rank): + entries = [ + ("Atomos Ninja Creator Monitor 5", "Atomos", 699, 759, 4.7, 54, "5-inch 1000 nit touchscreen", "4K60 ProRes", "HDMI in/out, USB-C", "2.5-inch SSD or USB-C media", "0.8 lb"), + ("Atomos Shogun Studio 7 Monitor Recorder", "Atomos", 1199, 1299, 4.6, 32, "7-inch 2000 nit HDR", "6K30 / 4K120", "HDMI, 12G-SDI, USB-C", "SSD media", "1.9 lb"), + ("Sony Creator Field Monitor 5", "Sony", 499, 549, 4.5, 41, "5.5-inch daylight display", "4K30 monitoring", "HDMI, USB-C power", "microSD LUT import", "0.9 lb"), + ("Blackmagic Video Assist 12G 7", "Blackmagic", 995, 1045, 4.7, 36, "7-inch HDR touchscreen", "4K60 BRAW", "12G-SDI, HDMI, USB-C", "Dual SD UHS-II", "1.7 lb"), + ("Atomos Neon Mobile Director Monitor", "Atomos", 1499, 1599, 4.6, 18, "17-inch on-set display", "4K60 monitoring", "HDMI, 12G-SDI", "External media module", "7.9 lb"), + ("Blackmagic Pocket View 5 HDR Monitor", "Blackmagic", 429, 469, 4.4, 22, "5-inch HDR touch display", "4K monitoring", "HDMI, USB-C power", "LUTs via SD card", "0.7 lb"), + ] + records = [] + for offset, entry in enumerate(entries): + name, brand, price, list_price, rating, review_count, panel, recording, connectivity, media, weight = entry + records.append( + make_product( + name=name, + brand=brand, + category_slug="monitors-recorders", + top_category_slug="video", + product_type="Monitor/Recorder", + short_description="Field monitor or recorder with brightness, recording, and I/O data tailored for compare-heavy production tasks.", + description=f"{name} is mirrored as a local-only monitoring listing with no firmware downloads, live media activation, or external service calls.", + price=price, + list_price=list_price, + rating=rating, + review_count=review_count, + qa_count=5 + offset, + best_seller_rank=start_rank + offset, + sort_newness=88 - offset, + accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), + specs=monitor_specs(panel, recording, "LUT and waveform tools", "HDR-ready", connectivity, weight), + search_blob=f"{brand} monitor recorder field display {recording} {connectivity}", + connectivity=connectivity, + availability="In Stock", + stock_level=5, + pickup_message="Ready at pro video counters", + shipping_message="Protected display shipping", + release_label="Production Monitor 2025", + featured=offset < 2, + deal_label="Video Special", + ) + ) + return records + + +def laptop_products(start_rank): + entries = [ + ("Apple CreatorBook 14 M3 Pro Laptop", "Apple", 2399, 2499, 4.8, 87, "M3 Pro 12-core", "36GB unified memory", "1TB SSD", "14.2-inch 3024x1964 mini-LED", "Thunderbolt 4 x3, HDMI, SDXC", "Wi-Fi 6E, Bluetooth 5.3", "3.5 lb"), + ("Dell Precision Edge 16 Laptop", "Dell", 2699, 2849, 4.7, 63, "Intel Core Ultra 9", "32GB DDR5", "2TB SSD", "16-inch 3840x2400 OLED", "Thunderbolt 4 x2, HDMI, SD", "Wi-Fi 7, Bluetooth 5.4", "4.4 lb"), + ("ASUS ProArt Studio 13 OLED Laptop", "ASUS", 1899, 1999, 4.6, 58, "AMD Ryzen AI 9", "32GB LPDDR5X", "1TB SSD", "13.3-inch 2880x1800 OLED", "USB4, HDMI, USB-A, SD", "Wi-Fi 6E, Bluetooth 5.3", "3.3 lb"), + ("Apple CreatorBook 16 Max Laptop", "Apple", 3199, 3349, 4.9, 51, "M3 Max 16-core", "48GB unified memory", "1TB SSD", "16.2-inch 3456x2234 mini-LED", "Thunderbolt 4 x3, HDMI, SDXC", "Wi-Fi 6E, Bluetooth 5.3", "4.7 lb"), + ("Dell Mobile Color 14 Laptop", "Dell", 1599, 1699, 4.5, 44, "Intel Core Ultra 7", "16GB DDR5", "1TB SSD", "14-inch 2880x1800 OLED", "Thunderbolt 4 x2, HDMI", "Wi-Fi 6E, Bluetooth 5.3", "3.2 lb"), + ("ASUS ProArt Studio 16 Laptop", "ASUS", 2299, 2399, 4.7, 39, "AMD Ryzen 9", "32GB DDR5", "2TB SSD", "16-inch 3840x2400 OLED", "USB4, HDMI, USB-A, SD Express", "Wi-Fi 6E, Bluetooth 5.3", "4.5 lb"), + ("Apple CreatorBook Air 15 Laptop", "Apple", 1499, 1599, 4.6, 72, "M3 8-core", "24GB unified memory", "512GB SSD", "15.3-inch 2880x1864 Liquid Retina", "MagSafe, USB-C x2", "Wi-Fi 6E, Bluetooth 5.3", "3.3 lb"), + ("Dell Creator Compact 13 Laptop", "Dell", 1399, 1499, 4.4, 33, "Intel Core Ultra 5", "16GB LPDDR5", "512GB SSD", "13.4-inch 1920x1200 IPS", "USB-C x2, USB-A", "Wi-Fi 6E, Bluetooth 5.3", "2.9 lb"), + ] + records = [] + for offset, entry in enumerate(entries): + name, brand, price, list_price, rating, review_count, processor, memory, storage, display, ports, connectivity, weight = entry + records.append( + make_product( + name=name, + brand=brand, + category_slug="laptops", + top_category_slug="computers", + product_type="Laptop", + short_description="Creator laptop with performance, display, and port detail rows designed for real shopping-style filtering and compare tasks.", + description=f"{name} is a deterministic creator notebook listing with no live financing, warranty registration, or software activation.", + price=price, + list_price=list_price, + rating=rating, + review_count=review_count, + qa_count=5 + offset, + best_seller_rank=start_rank + offset, + sort_newness=80 - offset, + accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), + specs=computer_specs(processor, memory, storage, display, ports, connectivity, weight), + search_blob=f"{brand} laptop creator {processor} {memory} {storage} {display}", + capacity_gb=2048 if "2TB" in storage else (1024 if "1TB" in storage else 512), + connectivity=connectivity, + availability="In Stock", + stock_level=6, + pickup_message="Ready in 2 hours", + shipping_message="Free insured shipping", + release_label="Compute 2025", + featured=offset < 2, + deal_label="Creator Laptop Sale", + ) + ) + return records + + +def monitor_products(start_rank): + entries = [ + ("BenQ ColorPro 32 PD3225U Monitor", "BenQ", 1199, 1299, 4.8, 58, "31.5-inch", "3840x2160", "95% P3 / 99% Rec.709", "DisplayHDR 400", "Thunderbolt 4, HDMI, DP, USB-C", "18.5 lb"), + ("Dell UltraSharp 32 Thunderbolt Monitor", "Dell", 1399, 1499, 4.6, 43, "32-inch", "3840x2160", "98% DCI-P3", "DisplayHDR 600", "Thunderbolt 4, HDMI, DP, USB hub", "20.0 lb"), + ("Apple Studio Panel 27 Monitor", "Apple", 1599, 1599, 4.7, 64, "27-inch", "5120x2880", "P3 wide color", "600 nits", "Thunderbolt 3, USB-C x3", "13.9 lb"), + ("ASUS ProArt 27 PA279CRV Monitor", "ASUS", 499, 549, 4.5, 72, "27-inch", "3840x2160", "99% DCI-P3 / Adobe RGB", "HDR10", "USB-C, HDMI, DP, USB hub", "15.2 lb"), + ("BenQ SW272U Photo Monitor", "BenQ", 799, 879, 4.7, 37, "27-inch", "3840x2160", "99% Adobe RGB", "HDR10", "USB-C, HDMI, DP", "17.1 lb"), + ("Dell DualView 40 Creator Monitor", "Dell", 1699, 1799, 4.6, 28, "40-inch", "5120x2160", "98% DCI-P3", "DisplayHDR 600", "Thunderbolt 4, HDMI, DP, Ethernet", "31.0 lb"), + ("Apple Studio Panel Nano 27 Monitor", "Apple", 1899, 1899, 4.8, 25, "27-inch", "5120x2880", "P3 wide color", "600 nits", "Thunderbolt 3, USB-C x3", "14.1 lb"), + ("ASUS CreatorView 32 OLED Monitor", "ASUS", 1299, 1399, 4.6, 23, "31.5-inch", "3840x2160 OLED", "99% DCI-P3", "HDR10", "USB-C, HDMI, DP", "18.8 lb"), + ] + records = [] + for offset, entry in enumerate(entries): + name, brand, price, list_price, rating, review_count, size, resolution, color, hdr, inputs, weight = entry + condition = "Open-Box" if "SW272U" in name else "New" + records.append( + make_product( + name=name, + brand=brand, + category_slug="monitors", + top_category_slug="computers", + product_type="Monitor", + short_description="Creator display with clear panel, color, and input data for side-by-side compare workflows.", + description=f"{name} is mirrored with a spec-heavy retailer-style presentation for color, connectivity, and pickup benchmarking.", + price=price, + list_price=list_price, + rating=rating, + review_count=review_count, + qa_count=4 + offset, + best_seller_rank=start_rank + offset, + sort_newness=72 - offset, + accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), + specs=monitor_specs(size, resolution, color, hdr, inputs, weight), + search_blob=f"{brand} monitor color {resolution} {size} {inputs}", + connectivity=inputs, + availability="In Stock" if condition == "New" else "Limited Stock", + stock_level=5 if condition == "New" else 1, + pickup_message="Pickup available in select stores", + shipping_message="Oversize monitor shipping", + release_label="Display 2025", + condition=condition, + used_highlight=condition != "New", + deal_label="Open-Box" if condition != "New" else "Monitor Sale", + deal_type="open-box" if condition != "New" else "sale", + ) + ) + return records + + +def printer_products(start_rank): + entries = [ + ("Epson P900 Fine Art Photo Printer", "Epson", 1195, 1295, 4.7, 52, "13-inch sheets and roll media", "5760 x 1440 dpi", "1.5 min A3+", "UltraChrome PRO10", "USB, Ethernet, Wi-Fi", "35.7 lb"), + ("Canon ImagePRO ScanLite 400", "Canon", 699, 779, 4.4, 29, "A4 document and photo scanning", "4800 dpi", "4 sec per photo", "CIS scanner", "USB 3.0", "9.8 lb"), + ("Epson V850 Archival Photo Scanner", "Epson", 999, 1099, 4.7, 41, "Film and reflective originals", "6400 dpi", "1 min per 35mm strip", "Dual-lens CCD", "USB 2.0", "14.0 lb"), + ("Canon PIXStudio Pro 200 Printer", "Canon", 599, 649, 4.5, 38, "13-inch sheets", "4800 x 2400 dpi", "90 sec A3+", "Dye ink 8-color", "USB, Wi-Fi, Ethernet", "32.0 lb"), + ("Epson SureColor P700 Compact Printer", "Epson", 799, 869, 4.6, 34, "13-inch sheets and roll media", "5760 x 1440 dpi", "2 min A3+", "UltraChrome PRO10", "USB, Wi-Fi, Ethernet", "28.0 lb"), + ("Canon ScanGear Film 900", "Canon", 349, 399, 4.3, 19, "Film and photo scanning", "4800 dpi", "35 sec 35mm frame", "CIS scanner", "USB-C", "7.1 lb"), + ("Epson EcoProof Label Printer", "Epson", 249, 279, 4.2, 24, "Shipping and asset labels", "600 dpi", "4 ips", "Pigment ink", "USB, Ethernet", "11.3 lb"), + ("Canon DocumentFlow D120 Scanner", "Canon", 429, 479, 4.4, 21, "A4 office scanning", "600 dpi", "45 ppm", "CIS scanner", "USB 3.0", "8.2 lb"), + ] + records = [] + for offset, entry in enumerate(entries): + name, brand, price, list_price, rating, review_count, media, resolution, speed, ink, connectivity, weight = entry + product_type = "Scanner" if "Scanner" in name or "Scan" in name else "Printer" + records.append( + make_product( + name=name, + brand=brand, + category_slug="printers-scanners", + top_category_slug="computers", + product_type=product_type, + short_description="Output or scanning hardware with media, resolution, and workflow spec rows for benchmark product tasks.", + description=f"{name} mirrors a pro output listing with deterministic shipping, stock, and support flows inside the local benchmark environment.", + price=price, + list_price=list_price, + rating=rating, + review_count=review_count, + qa_count=3 + offset, + best_seller_rank=start_rank + offset, + sort_newness=64 - offset, + accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), + specs=printer_specs(media, resolution, speed, ink, connectivity, weight), + search_blob=f"{brand} printer scanner photo output {media}", + connectivity=connectivity, + availability="In Stock", + stock_level=3 + (offset % 3), + pickup_message="Pickup at print workflow counters", + shipping_message="Freight-safe shipping", + release_label="Output 2025", + deal_label="Print Studio Sale", + ) + ) + return records + + +def build_products(): + products = [] + products.extend(mirrorless_products()) + products.extend(dslr_products(len(products) + 1)) + products.extend(lens_products(len(products) + 1)) + products.extend(cinema_products(len(products) + 1)) + products.extend(support_products(len(products) + 1)) + products.extend(storage_products(len(products) + 1)) + products.extend(lighting_products(len(products) + 1)) + products.extend(microphone_products(len(products) + 1)) + products.extend(headphone_products(len(products) + 1)) + products.extend(drone_products(len(products) + 1)) + products.extend(monitor_recorder_products(len(products) + 1)) + products.extend(laptop_products(len(products) + 1)) + products.extend(monitor_products(len(products) + 1)) + products.extend(printer_products(len(products) + 1)) + return products + + +def create_reviews(product, ProductReview): + templates = [ + ("Reliable for paid work", "Used this on three recent shoots and the deterministic B&H mirror details lined up perfectly with the specs and pickup messaging."), + ("Great balance of value and features", "The spec presentation makes it easy to compare against similar options without the page hiding the important workflow details."), + ("Solid creator workflow fit", "Shipping notes, accessories, and compatibility sections felt like a real retailer experience while staying fully local and synthetic."), + ] + reviews = [] + desired = 2 if product.best_seller_rank <= 40 else 1 + for index in range(desired): + headline, body = templates[(product.id + index) % len(templates)] + reviews.append( + ProductReview( + product_id=product.id, + author_name=["Alex M.", "Jordan P.", "Samira L.", "Miles C."][(product.id + index) % 4], + headline=headline, + body=f"{body} {product.name} handled as expected in this demo environment.", + rating=5 if index == 0 or product.rating >= 4.7 else 4, + verified_purchase=True, + created_at=MIRROR_REFERENCE_DATE - timedelta(days=(product.id + index) % 120), + ) + ) + return reviews + + +def create_questions(product, ProductQuestion, ProductAnswer): + prompts = [ + ("Does this include a charger or power supply in the box?", "Yes. The demo listing includes the default power accessories noted in the spec and package section."), + ("Is local store pickup supported for this item?", "Pickup is available anywhere the store inventory block shows stock. This mirror uses deterministic synthetic availability."), + ("Will this work for a hybrid photo and video workflow?", "It is positioned for hybrid creator use in the local mirror and the technical specs reflect that workflow emphasis."), + ("Does this ship with cables or core accessories?", "Yes. Included accessories are listed in the spec groups and remain stable for benchmark tasks."), + ] + qa_pairs = [] + count = 2 if product.best_seller_rank <= 60 else 1 + for index in range(count): + question_text, answer_text = prompts[(product.id + index) % len(prompts)] + question = ProductQuestion( + product_id=product.id, + question=question_text, + asker_name=["Priya", "Ethan", "Nina", "Oscar"][(product.id + index) % 4], + created_at=MIRROR_REFERENCE_DATE - timedelta(days=(product.id + index) % 90), + ) + qa_pairs.append((question, answer_text)) + return qa_pairs + + +def bundle_definitions(): + return [ + ("Sony Hybrid Creator Kit", ["sony-aurora-a7x-mirrorless-camera", "sigma-artline-24-70mm-f-2-8-dg-dn-lens", "sandisk-pro-cinema-cfexpress-type-b-512gb-card"], 3499, 3796, "Featured", "Photo/video hybrid creators"), + ("Canon Wedding Coverage Bundle", ["canon-orbit-r6-mark-ii-mirrorless-camera", "canon-rf-24-105mm-f-4l-is-lens", "peak-design-everyday-sling-10l"], 3449, 3667, "Bundle", "Event photographers"), + ("Nikon Long Zoom Field Kit", ["nikon-zenith-z8-mirrorless-camera", "nikon-z-70-200mm-f-2-8-vr-s-lens", "manfrotto-carbon-travel-tripod-pro"], 6099, 6291, "Bundle", "Sports and wildlife"), + ("Fujifilm Street Story Pack", ["fujifilm-northlight-x-t5-mirrorless-camera", "fujifilm-xf-33mm-f-1-4-r-lm-lens", "peak-design-everyday-sling-10l"], 2499, 2647, "Bundle", "Travel creators"), + ("Panasonic Video Starter Rig", ["panasonic-lumix-s5-ii-mirrorless-camera", "panasonic-lumix-24-105mm-f-4-macro-lens", "atomos-ninja-creator-monitor-5"], 3299, 3465, "Bundle", "Hybrid capture"), + ("Blackmagic Documentary Rig", ["blackmagic-scout-6k-pro-cinema-camera", "sigma-sports-150-600mm-f-5-6-3-dg-dn-lens", "sandisk-rugged-studio-ssd-4tb"], 4099, 4293, "Featured", "Documentary teams"), + ("Audio Creator Desk Pack", ["shure-mvx2-usb-stream-mic", "sennheiser-hd-490-pro-reference-headphones", "dell-mobile-color-14-laptop"], 2049, 2177, "Bundle", "Podcast desks"), + ("DJI Travel Interview Kit", ["dji-mic-air-2tx-kit", "dji-neo-cinema-mini-drone", "sandisk-extreme-portable-ssd-2tb"], 1199, 1297, "Bundle", "Travel storytellers"), + ("Aputure Lighting Interview Pack", ["aputure-storm-300x-bi-color-led", "aputure-fresnel-2x-modifier", "manfrotto-nano-light-stand-duo"], 1169, 1247, "Bundle", "Single-subject lighting"), + ("Color Grade Suite", ["benq-colorpro-32-pd3225u-monitor", "apple-creatorbook-14-m3-pro-laptop", "sandisk-rugged-studio-ssd-4tb"], 3949, 4097, "Featured", "Editors and colorists"), + ("Field Audio Capture Pack", ["rode-wireless-creator-duo", "sennheiser-profile-usb-mic", "sony-creator-anc-monitor-headphones"], 699, 817, "Bundle", "Mobile interviews"), + ("Photo Archiving Workflow", ["epson-v850-archival-photo-scanner", "epson-p900-fine-art-photo-printer", "lexar-workflow-dock-4-bay"], 2199, 2333, "Bundle", "Archive and print"), + ("Compact Production Monitor Kit", ["atomos-ninja-creator-monitor-5", "sony-fx30-studio-cinema-camera", "sandisk-pro-cinema-cfexpress-type-b-512gb-card"], 2399, 2526, "Bundle", "Video crews"), + ("Drone Survey Pack", ["dji-mavic-survey-drone", "sandisk-creator-microsd-512gb-card", "apple-creatorbook-air-15-laptop"], 3299, 3497, "Bundle", "Aerial mapping"), + ("Travel Vlog Essentials", ["canon-orbit-r50-v-mirrorless-camera", "dji-pocket-interview-mic", "benro-slim-photo-tripod-kit"], 1189, 1247, "Bundle", "One-person crews"), + ("Studio Monitor Match Set", ["dell-ultrasharp-32-thunderbolt-monitor", "asus-proart-27-pa279crv-monitor", "apple-studio-panel-27-monitor"], 3299, 3497, "Bundle", "Multi-monitor suites"), + ("Creator Laptop Pair", ["apple-creatorbook-14-m3-pro-laptop", "asus-proart-studio-13-oled-laptop"], 4049, 4298, "Bundle", "Capture and edit duo"), + ("Wedding Dual Body Set", ["canon-orbit-r6-mark-ii-mirrorless-camera", "nikon-zenith-zf-mirrorless-camera", "lexar-gold-sdxc-256gb-v90-card"], 4499, 4694, "Bundle", "Two body coverage"), + ("Podcast Launch Bundle", ["shure-mv7x-voice-broadcast-mic", "sennheiser-accent-podcast-pack", "dell-creator-compact-13-laptop"], 1899, 1987, "Bundle", "New podcast launches"), + ("RGB Practical Lighting Set", ["godox-tubeflow-rgb-pair", "aputure-mc-pro-pocket-rgb-light", "peak-design-mobile-creator-stand"], 499, 557, "Bundle", "On-location accents"), + ] + + +def ensure_visual_assets(base_dir: str, products, bundles): + ensure_misc_assets(base_dir) + images_root = Path(base_dir) / "static" / "images" + products_root = images_root / "products" + bundles_root = images_root / "bundles" + for product in products: + image_path = products_root / f"{product['slug']}.svg" + ensure_svg(image_path, product["brand"], product["name"], product["accent_color"], product["product_type"]) + product["image_path"] = f"images/products/{product['slug']}.svg" + for bundle in bundles: + ensure_svg( + bundles_root / f"{bundle['slug']}.svg", + bundle["title"], + bundle["audience"], + "#24423f", + "Monitor", + ) + bundle["image_path"] = f"images/bundles/{bundle['slug']}.svg" + + +def seed_database(db, models, base_dir: str): + Product = models["Product"] + if Product.query.count() > 0: + return + + Category = models["Category"] + Brand = models["Brand"] + ProductImage = models["ProductImage"] + ProductSpecGroup = models["ProductSpecGroup"] + ProductSpec = models["ProductSpec"] + ProductVariant = models["ProductVariant"] + ProductReview = models["ProductReview"] + ProductQuestion = models["ProductQuestion"] + ProductAnswer = models["ProductAnswer"] + Bundle = models["Bundle"] + BundleItem = models["BundleItem"] + StoreLocation = models["StoreLocation"] + StoreInventory = models["StoreInventory"] + Deal = models["Deal"] + + category_by_slug = {} + for item in CATEGORY_DEFS: + category = Category( + name=item["name"], + slug=item["slug"], + description=item.get("description", ""), + hero_copy=item.get("hero_copy", item.get("description", "")), + icon_label=item.get("icon_label", item["name"][:4]), + nav_order=item.get("nav_order", 99), + ) + db.session.add(category) + category_by_slug[item["slug"]] = category + db.session.flush() + for item in CATEGORY_DEFS: + if item.get("parent"): + category_by_slug[item["slug"]].parent_id = category_by_slug[item["parent"]].id + + brand_by_name = {} + for name, origin, color, blurb in BRAND_DEFS: + brand = Brand(name=name, slug=slugify(name), origin=origin, badge_color=color, blurb=blurb) + db.session.add(brand) + brand_by_name[name] = brand + db.session.flush() + + product_blueprints = build_products() + bundle_blueprints = [ + {"title": title, "slug": slugify(title), "items": items, "bundle_price": bundle_price, "list_price": list_price, "badge": badge, "audience": audience} + for title, items, bundle_price, list_price, badge, audience in bundle_definitions() + ] + ensure_visual_assets(base_dir, product_blueprints, bundle_blueprints) + + products_by_slug = {} + created_products = [] + for blueprint in product_blueprints: + product = Product( + category_id=category_by_slug[blueprint["category_slug"]].id, + brand_id=brand_by_name[blueprint["brand"]].id, + name=blueprint["name"], + slug=blueprint["slug"], + sku=blueprint["sku"], + short_description=blueprint["short_description"], + description=blueprint["description"], + search_blob=blueprint["search_blob"], + price=blueprint["price"], + list_price=blueprint["list_price"], + rating=blueprint["rating"], + review_count=blueprint["review_count"], + qa_count=blueprint["qa_count"], + condition=blueprint["condition"], + availability=blueprint["availability"], + stock_level=blueprint["stock_level"], + pickup_available=blueprint["pickup_available"], + pickup_message=blueprint["pickup_message"], + shipping_message=blueprint["shipping_message"], + return_window=blueprint["return_window"], + warranty=blueprint["warranty"], + best_seller_rank=blueprint["best_seller_rank"], + sort_newness=blueprint["sort_newness"], + top_category_slug=blueprint["top_category_slug"], + subcategory_slug=blueprint["subcategory_slug"], + product_family=blueprint["product_family"], + product_type=blueprint["product_type"], + sensor_size=blueprint["sensor_size"], + mount_type=blueprint["mount_type"], + focal_length=blueprint["focal_length"], + focal_length_bucket=blueprint["focal_length_bucket"], + megapixels=blueprint["megapixels"], + capacity_gb=blueprint["capacity_gb"], + connectivity=blueprint["connectivity"], + image_path=blueprint["image_path"], + accent_color=blueprint["accent_color"], + release_label=blueprint["release_label"], + is_featured=blueprint["featured"], + is_bundle_anchor=blueprint["bundle_anchor"], + is_used_highlight=blueprint["used_highlight"], + ) + db.session.add(product) + db.session.flush() + products_by_slug[product.slug] = product + created_products.append((product, blueprint)) + + for order, label in enumerate(["Primary", "Detail", "Kit View"]): + db.session.add(ProductImage(product_id=product.id, path=product.image_path, label=label, sort_order=order)) + + for group_order, group in enumerate(blueprint["specs"]): + spec_group = ProductSpecGroup(product_id=product.id, title=group["title"], sort_order=group_order) + db.session.add(spec_group) + db.session.flush() + for spec_order, (spec_name, spec_value) in enumerate(group["rows"]): + db.session.add( + ProductSpec( + group_id=spec_group.id, + name=spec_name, + value=spec_value, + sort_order=spec_order, + ) + ) + + for order, variant in enumerate(blueprint["variants"]): + label, variant_type, value, delta = variant + db.session.add( + ProductVariant( + product_id=product.id, + label=label, + variant_type=variant_type, + value=value, + price_delta=delta, + ) + ) + + if blueprint["deal_label"]: + db.session.add( + Deal( + product_id=product.id, + label=blueprint["deal_label"], + sale_price=blueprint["price"], + deal_type=blueprint["deal_type"], + is_active=True, + ) + ) + + stores = [] + for name, slug, city, state, address, hours, phone, note in STORE_DEFS: + store = StoreLocation( + name=name, + slug=slug, + city=city, + state=state, + address=address, + pickup_hours=hours, + contact_phone=phone, + inventory_note=note, + ) + db.session.add(store) + stores.append(store) + db.session.flush() + + for product, blueprint in created_products: + store_count = 0 + for store_index, store in enumerate(stores): + seed = sum(ord(char) for char in f"{product.slug}{store.slug}") + quantity = 0 + if product.pickup_available and product.availability != "Pre-Order": + quantity = seed % 6 + if product.condition != "New": + quantity = min(quantity, 2) + pickup_eta = "Ready in 2 hours" if quantity >= 3 else "Ready tomorrow after 11:00" + db.session.add( + StoreInventory( + store_id=store.id, + product_id=product.id, + quantity=quantity, + pickup_eta=pickup_eta, + ) + ) + if quantity > 0: + store_count += 1 + product.pickup_store_count = store_count + + review_rows = [] + question_rows = [] + answer_rows = [] + for product, _blueprint in created_products: + review_rows.extend(create_reviews(product, ProductReview)) + for question, answer_text in create_questions(product, ProductQuestion, ProductAnswer): + db.session.add(question) + db.session.flush() + answer_rows.append( + ProductAnswer( + question_id=question.id, + responder_name=["B&H Demo Team", "Store Specialist", "Workflow Advisor"][question.id % 3], + answer=answer_text, + created_at=question.created_at + timedelta(hours=12), + ) + ) + db.session.add_all(review_rows) + db.session.add_all(answer_rows) + + for bundle_blueprint in bundle_blueprints: + bundle = Bundle( + title=bundle_blueprint["title"], + slug=bundle_blueprint["slug"], + description=f"{bundle_blueprint['title']} collects compatible items into a deterministic checkout-ready package for benchmark tasks.", + image_path=bundle_blueprint["image_path"], + bundle_price=bundle_blueprint["bundle_price"], + list_price=bundle_blueprint["list_price"], + badge=bundle_blueprint["badge"], + audience=bundle_blueprint["audience"], + featured=bundle_blueprint["badge"] == "Featured", + ) + db.session.add(bundle) + db.session.flush() + for item_slug in bundle_blueprint["items"]: + db.session.add(BundleItem(bundle_id=bundle.id, product_id=products_by_slug[item_slug].id, quantity=1)) + + db.session.commit() + + +def seed_benchmark_users(db, models): + User = models["User"] + if User.query.filter_by(email="alice.j@test.com").first(): + return + + Address = models["Address"] + CartItem = models["CartItem"] + WishlistItem = models["WishlistItem"] + CompareItem = models["CompareItem"] + Order = models["Order"] + OrderItem = models["OrderItem"] + StoreReservation = models["StoreReservation"] + StoreLocation = models["StoreLocation"] + Product = models["Product"] + + stores = StoreLocation.query.order_by(StoreLocation.id).all() + products = {product.slug: product for product in Product.query.all()} + created_users = [] + + for index, user_data in enumerate(USER_DEFS): + user = User( + email=user_data["email"], + username=user_data["username"], + display_name=user_data["display_name"], + phone=f"(555) 200-01{index + 1:02d}", + company=user_data["company"], + role=user_data["role"], + preferred_store_id=stores[index % len(stores)].id, + newsletter_opt_in=index % 2 == 0, + sms_opt_in=index in (1, 3), + created_at=MIRROR_REFERENCE_DATE - timedelta(days=120 - index * 11), + ) + user.set_password(BENCHMARK_PASSWORD) + db.session.add(user) + db.session.flush() + created_users.append(user) + db.session.add( + Address( + user_id=user.id, + label="Studio", + recipient=user.display_name, + line1=f"{100 + index * 11} Benchmark Ave", + city=["New York", "Brooklyn", "Austin", "Los Angeles"][index], + state=["NY", "NY", "TX", "CA"][index], + zip_code=["10001", "11217", "78701", "90013"][index], + phone=user.phone, + is_default=True, + ) + ) + + db.session.flush() + + alice, bob, carol, david = created_users + wishlist_map = { + alice.id: ["benq-colorpro-32-pd3225u-monitor", "fujifilm-northlight-x-t5-mirrorless-camera", "aputure-storm-300x-bi-color-led", "sandisk-rugged-studio-ssd-4tb"], + bob.id: ["blackmagic-scout-6k-pro-cinema-camera", "dji-airframe-4s-fly-more-drone", "atomos-ninja-creator-monitor-5", "rode-wireless-creator-duo"], + carol.id: ["shure-mvx2-usb-stream-mic", "sennheiser-hd-490-pro-reference-headphones", "apple-creatorbook-air-15-laptop"], + david.id: ["apple-creatorbook-14-m3-pro-laptop", "benq-sw272u-photo-monitor", "epson-p900-fine-art-photo-printer"], + } + compare_map = { + alice.id: ["sony-aurora-a7x-mirrorless-camera", "canon-orbit-r6-mark-ii-mirrorless-camera", "fujifilm-northlight-x-t5-mirrorless-camera"], + bob.id: ["blackmagic-scout-6k-pro-cinema-camera", "sony-fx30-studio-cinema-camera", "canon-c70-motion-cinema-camera"], + carol.id: ["rode-wireless-creator-duo", "dji-mic-air-2tx-kit", "shure-mvx2-usb-stream-mic"], + david.id: ["apple-creatorbook-14-m3-pro-laptop", "dell-precision-edge-16-laptop", "asus-proart-studio-13-oled-laptop"], + } + cart_map = { + alice.id: [("sony-aurora-a7x-mirrorless-camera", 1), ("sigma-artline-24-70mm-f-2-8-dg-dn-lens", 1)], + bob.id: [("blackmagic-scout-6k-pro-cinema-camera", 1), ("atomos-ninja-creator-monitor-5", 1), ("sandisk-pro-cinema-cfexpress-type-b-512gb-card", 2)], + carol.id: [("shure-mvx2-usb-stream-mic", 1), ("sennheiser-profile-usb-mic", 1)], + david.id: [("benq-colorpro-32-pd3225u-monitor", 1), ("sandisk-rugged-studio-ssd-4tb", 1)], + } + reservation_map = { + alice.id: ("fujifilm-northlight-x-t5-mirrorless-camera", stores[0].id), + bob.id: ("blackmagic-scout-6k-pro-cinema-camera", stores[4].id), + carol.id: ("rode-wireless-creator-duo", stores[1].id), + david.id: ("benq-colorpro-32-pd3225u-monitor", stores[5].id), + } + + for user_id, slugs in wishlist_map.items(): + for slug in slugs: + db.session.add(WishlistItem(user_id=user_id, product_id=products[slug].id, created_at=MIRROR_REFERENCE_DATE - timedelta(days=(products[slug].id % 40)))) + for user_id, slugs in compare_map.items(): + for slug in slugs: + db.session.add(CompareItem(user_id=user_id, product_id=products[slug].id, created_at=MIRROR_REFERENCE_DATE - timedelta(days=(products[slug].id % 25)))) + for user_id, entries in cart_map.items(): + for slug, quantity in entries: + db.session.add(CartItem(user_id=user_id, product_id=products[slug].id, quantity=quantity, added_at=MIRROR_REFERENCE_DATE - timedelta(days=(products[slug].id % 10)))) + for user_id, (slug, store_id) in reservation_map.items(): + db.session.add( + StoreReservation( + user_id=user_id, + store_id=store_id, + product_id=products[slug].id, + quantity=1, + status="Reserved", + pickup_window="Ready tomorrow after 11:00", + created_at=MIRROR_REFERENCE_DATE - timedelta(days=3 + (products[slug].id % 4)), + ) + ) + + order_defs = [ + (alice, "BH-20260402-0101", "Delivered", "Ship to address", ["canon-orbit-r6-mark-ii-mirrorless-camera", "canon-rf-24-105mm-f-4l-is-lens"], 18.50, 221.73, "Delivered to Brooklyn studio"), + (alice, "BH-20260314-0102", "Delivered", "Store pickup", ["peak-design-everyday-sling-10l"], 0.00, 13.22, "Picked up at NYC SuperStore"), + (bob, "BH-20260409-0201", "Delivered", "Ship to address", ["sony-fx30-studio-cinema-camera", "atomos-ninja-creator-monitor-5", "sandisk-pro-cinema-cfexpress-type-b-512gb-card"], 24.95, 311.42, "Delivered to Studio Meridian"), + (carol, "BH-20260330-0301", "Delivered", "Ship to address", ["rode-wireless-creator-duo", "sennheiser-hd-490-pro-reference-headphones"], 0.00, 61.11, "Delivered to Signal Audio"), + (david, "BH-20260411-0401", "Processing", "Store pickup", ["apple-creatorbook-14-m3-pro-laptop", "benq-colorpro-32-pd3225u-monitor"], 0.00, 321.63, "Awaiting pickup at Chicago Pro Counter"), + ] + for user, order_number, status, fulfillment, slugs, shipping, tax, note in order_defs: + order = Order( + user_id=user.id, + order_number=order_number, + status=status, + fulfillment=fulfillment, + payment_label="Demo Visa ending in 4242", + shipping=shipping, + tax=round(tax, 2), + note=note, + created_at=MIRROR_REFERENCE_DATE - timedelta(days=1 + len(order_number)), + ) + db.session.add(order) + db.session.flush() + subtotal = 0 + for slug in slugs: + product = products[slug] + subtotal += product.display_price + db.session.add( + OrderItem( + order_id=order.id, + product_id=product.id, + product_name=product.name, + image_path=product.main_image, + quantity=1, + price=product.display_price, + variant_label="Standard", + ) + ) + order.subtotal = round(subtotal, 2) + order.total = round(order.subtotal + order.shipping + order.tax, 2) + + db.session.commit() + + +def copy_instance_to_seed(base_dir: str) -> None: + source = Path(base_dir) / "instance" / "bh_photo.db" + target_dir = Path(base_dir) / "instance_seed" + target_dir.mkdir(parents=True, exist_ok=True) + shutil.copy2(source, target_dir / "bh_photo.db") diff --git a/sites/bh_photo/static/css/main.css b/sites/bh_photo/static/css/main.css new file mode 100644 index 000000000..6a76eca93 --- /dev/null +++ b/sites/bh_photo/static/css/main.css @@ -0,0 +1,1133 @@ +:root { + --bg: #eef2ef; + --paper: #ffffff; + --paper-alt: #f6f7f7; + --text: #1b2327; + --muted: #5d6b72; + --border: #d7dfdd; + --brand-dark: #2d382f; + --brand-deep: #213129; + --brand-gold: #f1c74b; + --brand-green: #2d7a5d; + --brand-orange: #cb6a2b; + --brand-blue: #2f5f8f; + --danger: #b14141; + --shadow: 0 18px 45px rgba(26, 39, 36, 0.08); + --radius: 18px; +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + font-family: "Segoe UI", "Helvetica Neue", Arial, sans-serif; + color: var(--text); + background: radial-gradient(circle at top left, #f7fbf9 0, var(--bg) 38%, #e7ece8 100%); +} + +a { + color: inherit; + text-decoration: none; +} + +img { + display: block; + max-width: 100%; +} + +button, +input, +select, +textarea { + font: inherit; +} + +.shell { + width: min(1240px, calc(100vw - 32px)); + margin: 0 auto; +} + +.promo-strip { + background: linear-gradient(90deg, #f8d762, #efc541); + color: #372b08; + font-size: 14px; +} + +.promo-inner { + display: flex; + justify-content: space-between; + align-items: center; + gap: 16px; + padding: 10px 0; +} + +.promo-pill, +.count-chip, +.badge, +.filter-chip { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 999px; + padding: 4px 10px; + font-size: 12px; + font-weight: 700; +} + +.promo-pill { + background: rgba(55, 43, 8, 0.12); +} + +.count-chip { + background: rgba(255, 255, 255, 0.14); + min-width: 24px; +} + +.site-header { + background: linear-gradient(180deg, var(--brand-dark), var(--brand-deep)); + color: #f1f5f2; + box-shadow: 0 10px 25px rgba(18, 25, 20, 0.18); +} + +.header-top { + display: grid; + grid-template-columns: auto 1fr auto; + gap: 24px; + align-items: center; + padding: 18px 0; +} + +.brand-lockup { + display: inline-flex; + align-items: center; + gap: 14px; +} + +.brand-mark { + display: inline-flex; + align-items: center; + justify-content: center; + width: 82px; + height: 52px; + border-radius: 16px; + background: var(--brand-gold); + color: #2d2711; + font-size: 28px; + font-weight: 900; +} + +.brand-copy strong { + display: block; + font-size: 21px; +} + +.brand-copy small { + color: rgba(241, 245, 242, 0.76); + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.search-bar { + display: flex; + align-items: center; + background: rgba(255, 255, 255, 0.11); + padding: 8px; + border-radius: 999px; + border: 1px solid rgba(255, 255, 255, 0.08); +} + +.search-bar input { + border: 0; + outline: 0; + background: transparent; + color: #fff; + width: 100%; + padding: 0 16px; +} + +.search-bar input::placeholder { + color: rgba(255, 255, 255, 0.7); +} + +.search-bar button, +.cta, +.ghost, +.quiet-btn { + border: 0; + cursor: pointer; + border-radius: 999px; + transition: transform 0.15s ease, opacity 0.15s ease, background 0.2s ease; +} + +.search-bar button, +.cta { + background: var(--brand-gold); + color: #2d2711; + padding: 12px 22px; + font-weight: 800; +} + +.ghost { + background: rgba(36, 66, 63, 0.08); + color: var(--brand-deep); + padding: 12px 20px; + border: 1px solid rgba(36, 66, 63, 0.18); +} + +.quiet-btn { + background: rgba(36, 66, 63, 0.08); + color: var(--brand-blue); + padding: 9px 14px; + font-weight: 700; +} + +.cta.small, +.ghost.small { + padding: 10px 16px; +} + +.cta.block, +.ghost.block, +.quiet-btn.block { + display: block; + width: 100%; + text-align: center; +} + +.header-actions { + display: flex; + align-items: center; + gap: 14px; + font-size: 14px; +} + +.primary-nav { + border-top: 1px solid rgba(255, 255, 255, 0.08); +} + +.nav-row { + display: flex; + align-items: center; + gap: 18px; + padding: 13px 0; + overflow-x: auto; + white-space: nowrap; + font-size: 15px; +} + +.flash-stack { + display: grid; + gap: 10px; + margin-top: 18px; +} + +.flash { + border-radius: 14px; + padding: 14px 16px; + background: var(--paper); + border: 1px solid var(--border); + box-shadow: var(--shadow); +} + +.flash.success { + border-color: rgba(45, 122, 93, 0.25); +} + +.flash.danger { + border-color: rgba(177, 65, 65, 0.35); +} + +.page-wrap { + padding-bottom: 56px; +} + +.hero, +.page-hero, +.listing-layout, +.product-layout, +.pickup-layout, +.cart-layout, +.checkout-layout, +.receipt-layout, +.dashboard-grid, +.address-grid, +.help-grid { + margin-top: 28px; +} + +.hero-grid, +.pickup-layout, +.cart-layout, +.checkout-layout, +.receipt-layout { + display: grid; + gap: 24px; +} + +.hero-grid { + grid-template-columns: 1.4fr 0.9fr; + align-items: stretch; +} + +.hero-copy, +.hero-panel, +.page-hero.simple, +.info-card, +.purchase-card, +.bundle-card, +.product-card, +.category-tile, +.category-stack, +.order-card, +.card-form, +.empty-state, +.compare-top .compare-product, +.pickup-card, +.hero-card, +.spotlight-card { + background: var(--paper); + border: 1px solid var(--border); + border-radius: var(--radius); + box-shadow: var(--shadow); +} + +.hero-copy { + padding: 38px; + background: linear-gradient(135deg, #f7fbf8, #ffffff 60%, #eff5f2); +} + +.hero-copy h1, +.page-hero h1, +.auth-panel h1 { + margin: 10px 0 14px; + line-height: 1.05; + font-size: clamp(2.2rem, 5vw, 4rem); +} + +.hero-copy p, +.page-hero p, +.lead-copy, +.info-card p, +.mini-spec-card li, +.detail-panel p { + color: var(--muted); + line-height: 1.6; +} + +.kicker, +.eyebrow { + margin: 0; + font-size: 12px; + font-weight: 800; + letter-spacing: 0.14em; + text-transform: uppercase; + color: var(--brand-green); +} + +.hero-actions, +.section-head, +.price-line, +.rating-line, +.chip-row, +.spec-chip-row, +.card-actions, +.hero-card ul, +.summary-list, +.order-head, +.stack-head { + display: flex; + gap: 14px; +} + +.hero-actions { + margin-top: 24px; +} + +.hero-panel { + padding: 18px; + background: linear-gradient(180deg, rgba(241, 199, 75, 0.2), rgba(255, 255, 255, 0.88)); +} + +.hero-card { + height: 100%; + padding: 28px; + background: linear-gradient(160deg, #28372f, #1b2b24); + color: #f1f5f2; +} + +.hero-card h3 { + margin-top: 0; +} + +.hero-card ul { + flex-direction: column; + padding-left: 18px; + color: rgba(241, 245, 242, 0.82); +} + +.shelf-section { + margin-top: 38px; +} + +.section-head { + justify-content: space-between; + align-items: end; + margin-bottom: 18px; +} + +.section-head h2, +.pickup-product h2, +.purchase-card h2, +.bundle-card h2 { + margin: 6px 0 0; + font-size: 1.7rem; +} + +.category-grid, +.product-grid, +.bundle-grid, +.spotlight-grid, +.dashboard-grid, +.address-grid, +.help-grid, +.pickup-grid { + display: grid; + gap: 18px; +} + +.category-grid { + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); +} + +.product-grid { + grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); +} + +.product-grid.dense { + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); +} + +.bundle-grid { + grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); +} + +.bundle-grid.tall { + grid-template-columns: 1fr; +} + +.spotlight-grid { + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); +} + +.category-tile, +.spotlight-card { + padding: 22px; +} + +.category-tile small { + margin-top: 8px; + display: block; + color: var(--muted); + line-height: 1.5; +} + +.category-icon { + display: inline-flex; + width: 58px; + height: 58px; + align-items: center; + justify-content: center; + border-radius: 16px; + background: rgba(45, 122, 93, 0.11); + color: var(--brand-deep); + font-weight: 800; + margin-bottom: 14px; +} + +.dual-shelf { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 24px; + margin-top: 38px; +} + +.shelf-panel { + background: var(--paper); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 24px; + box-shadow: var(--shadow); +} + +.mini-list { + display: grid; + gap: 14px; +} + +.mini-row { + display: grid; + grid-template-columns: 72px 1fr; + gap: 14px; + align-items: center; +} + +.mini-row.text-only { + grid-template-columns: 1fr; +} + +.mini-row img { + width: 72px; + height: 72px; + object-fit: cover; + border-radius: 14px; + background: var(--paper-alt); +} + +.mini-row strong { + display: block; +} + +.mini-row small, +.muted, +.shipping-line, +.stock-line, +.card-copy { + color: var(--muted); +} + +.listing-layout { + display: grid; + grid-template-columns: 280px 1fr; + gap: 22px; +} + +.filters, +.listing-content, +.detail-panel, +.pickup-product, +.receipt-items { + background: var(--paper); + border: 1px solid var(--border); + border-radius: var(--radius); + box-shadow: var(--shadow); +} + +.filters, +.detail-panel, +.listing-content, +.pickup-product, +.receipt-items { + padding: 22px; +} + +.filters form, +.stack-form, +.card-form, +.store-list { + display: grid; + gap: 14px; +} + +.filters label, +.card-form label, +.stack-form label { + display: grid; + gap: 6px; + font-weight: 600; +} + +input, +select, +textarea { + width: 100%; + border: 1px solid var(--border); + border-radius: 12px; + padding: 12px 14px; + background: var(--paper-alt); + color: var(--text); +} + +textarea { + resize: vertical; +} + +.range-row, +.card-form.two-col { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 14px; +} + +.card-form.two-col .full { + grid-column: 1 / -1; +} + +.listing-head { + display: flex; + justify-content: space-between; + gap: 18px; + margin-bottom: 18px; +} + +.filter-chip { + background: rgba(36, 66, 63, 0.08); + color: var(--brand-deep); +} + +.product-card { + overflow: hidden; + position: relative; +} + +.product-card-media { + display: block; + background: linear-gradient(180deg, #edf4f1, #f9fbfb); + padding: 20px; + min-height: 200px; +} + +.product-card-media img { + width: 100%; + aspect-ratio: 4 / 3; + object-fit: cover; + border-radius: 14px; +} + +.badge { + position: absolute; + top: 18px; + left: 18px; +} + +.badge-green { + background: rgba(45, 122, 93, 0.14); + color: var(--brand-green); +} + +.badge-orange { + background: rgba(203, 106, 43, 0.12); + color: var(--brand-orange); +} + +.product-card-body { + padding: 18px; +} + +.product-card h3, +.bundle-card h3, +.compare-product h3, +.mini-spec-card h3, +.review-card h3, +.qa-card h3 { + margin: 8px 0 10px; +} + +.product-card h3 a, +.bundle-card h2, +.order-card strong { + color: var(--text); +} + +.rating-line { + align-items: center; + flex-wrap: wrap; + font-size: 14px; + color: var(--muted); +} + +.rating-line.roomy { + margin-bottom: 14px; +} + +.price-line { + align-items: baseline; + flex-wrap: wrap; + margin: 12px 0 10px; +} + +.price-line.large strong { + font-size: 2rem; +} + +.price-line strong { + font-size: 1.35rem; +} + +.strike { + color: var(--muted); + text-decoration: line-through; +} + +.save { + color: var(--brand-green); + font-weight: 700; +} + +.stock-line.good { + color: var(--brand-green); +} + +.stock-line.warn { + color: var(--brand-orange); +} + +.product-layout { + display: grid; + grid-template-columns: 0.95fr 1.1fr 0.8fr; + gap: 22px; +} + +.product-gallery, +.product-main, +.purchase-column { + min-width: 0; +} + +.product-gallery, +.product-main { + background: var(--paper); + border: 1px solid var(--border); + border-radius: var(--radius); + box-shadow: var(--shadow); + padding: 22px; +} + +.hero-image { + width: 100%; + border-radius: 18px; + background: linear-gradient(180deg, #eff4f2, #f8fbfb); +} + +.thumb-row { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 12px; + margin-top: 12px; +} + +.thumb-row img { + border-radius: 12px; + background: var(--paper-alt); +} + +.lead-copy { + margin: 0 0 18px; +} + +.spec-chip-row { + flex-wrap: wrap; + margin-bottom: 18px; +} + +.spec-chip-row span { + padding: 10px 12px; + border-radius: 12px; + background: rgba(36, 66, 63, 0.06); + color: var(--muted); + font-size: 13px; +} + +.tab-row { + display: flex; + gap: 10px; + border-bottom: 1px solid var(--border); + margin-bottom: 18px; + padding-bottom: 12px; + overflow-x: auto; +} + +.tab-row a { + padding: 9px 14px; + border-radius: 999px; + font-weight: 700; + color: var(--muted); +} + +.tab-row a.active { + background: rgba(36, 66, 63, 0.1); + color: var(--brand-deep); +} + +.detail-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 14px; +} + +.mini-spec-card { + background: var(--paper-alt); + border: 1px solid var(--border); + border-radius: 16px; + padding: 16px; +} + +.mini-spec-card ul, +.bundle-items, +.footer-grid ul, +.store-list { + padding-left: 18px; + margin: 0; +} + +.spec-table { + display: grid; + gap: 8px; +} + +.spec-table div { + display: grid; + grid-template-columns: 220px 1fr; + gap: 14px; + padding: 11px 0; + border-top: 1px solid var(--border); +} + +.spec-table dt { + color: var(--muted); +} + +.purchase-column { + display: grid; + gap: 16px; + align-content: start; +} + +.purchase-card { + padding: 22px; +} + +.purchase-meta, +.footer-grid ul { + margin: 0; + display: grid; + gap: 8px; + color: var(--muted); +} + +.compare-top { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: 18px; + margin-bottom: 24px; +} + +.compare-product { + padding: 18px; +} + +.compare-product img { + border-radius: 14px; + margin-bottom: 14px; +} + +.compare-group { + margin-bottom: 24px; + background: var(--paper); + border: 1px solid var(--border); + border-radius: var(--radius); + box-shadow: var(--shadow); + overflow: hidden; +} + +.compare-group h2 { + margin: 0; + padding: 16px 18px; + background: rgba(36, 66, 63, 0.06); +} + +.compare-table { + width: 100%; + border-collapse: collapse; +} + +.compare-table th, +.compare-table td { + text-align: left; + padding: 14px 18px; + border-top: 1px solid var(--border); + vertical-align: top; +} + +.compare-table th { + width: 220px; + color: var(--muted); +} + +.compare-table tr.different td { + background: rgba(241, 199, 75, 0.12); +} + +.bundle-card { + display: grid; + grid-template-columns: 220px 1fr; + gap: 18px; + padding: 18px; +} + +.bundle-card img { + border-radius: 16px; + background: var(--paper-alt); +} + +.pickup-layout { + grid-template-columns: 1.4fr 0.75fr; +} + +.pickup-grid, +.address-grid, +.help-grid, +.dashboard-grid { + grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); +} + +.pickup-card, +.info-card, +.review-card, +.qa-card, +.order-card, +.empty-state { + padding: 18px; +} + +.store-list article { + margin-bottom: 14px; +} + +.auth-wrap { + display: flex; + justify-content: center; + margin-top: 34px; +} + +.auth-wrap.wide .auth-panel { + max-width: 860px; +} + +.auth-panel { + width: min(560px, 100%); + background: var(--paper); + border: 1px solid var(--border); + border-radius: var(--radius); + box-shadow: var(--shadow); + padding: 32px; +} + +.auth-note { + background: rgba(241, 199, 75, 0.14); + border-radius: 14px; + padding: 12px 14px; +} + +.dashboard-links { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin-top: 22px; +} + +.dashboard-links a { + padding: 12px 16px; + border-radius: 999px; + background: var(--paper); + border: 1px solid var(--border); + box-shadow: var(--shadow); +} + +.order-stack, +.address-grid { + display: grid; + gap: 18px; +} + +.order-head, +.summary-list div, +.cart-row, +.breadcrumb-row { + justify-content: space-between; + align-items: center; +} + +.mini-list.stacked, +.receipt-items { + gap: 12px; +} + +.cart-layout, +.checkout-layout, +.receipt-layout { + grid-template-columns: 1.2fr 0.8fr; +} + +.cart-items, +.receipt-items { + display: grid; + gap: 14px; +} + +.cart-row { + display: grid; + grid-template-columns: 108px 1fr auto auto auto; + gap: 16px; + padding: 18px; + background: var(--paper); + border: 1px solid var(--border); + border-radius: var(--radius); + box-shadow: var(--shadow); +} + +.cart-row img { + width: 108px; + border-radius: 14px; +} + +.receipt-row { + background: transparent; + box-shadow: none; +} + +.inline-form { + display: flex; + align-items: center; + gap: 10px; +} + +.inline-form input { + width: 74px; +} + +.summary-list { + flex-direction: column; + margin: 14px 0 0; +} + +.summary-list div { + display: flex; + padding: 9px 0; + border-top: 1px solid var(--border); +} + +.summary-list .total { + font-size: 1.1rem; + font-weight: 800; +} + +.breadcrumb-row { + display: flex; + gap: 10px; + color: var(--muted); + font-size: 14px; +} + +.site-footer { + margin-top: 56px; + background: var(--brand-deep); + color: #f1f5f2; +} + +.footer-grid { + display: grid; + grid-template-columns: 1.3fr 1fr 1fr; + gap: 24px; + padding: 30px 0 40px; +} + +.footer-grid p, +.footer-grid li, +.footer-grid a { + color: rgba(241, 245, 242, 0.82); +} + +.empty-state { + text-align: center; +} + +.checkline { + display: flex !important; + align-items: center; + gap: 10px !important; +} + +.checkline input { + width: auto; +} + +.compact { + margin-bottom: 10px; +} + +@media (max-width: 1100px) { + .header-top, + .hero-grid, + .product-layout, + .listing-layout, + .pickup-layout, + .cart-layout, + .checkout-layout, + .receipt-layout, + .dual-shelf, + .footer-grid, + .bundle-card { + grid-template-columns: 1fr; + } + + .header-actions { + flex-wrap: wrap; + justify-content: flex-end; + } + + .product-layout { + grid-template-columns: 1fr; + } +} + +@media (max-width: 760px) { + .shell { + width: min(100vw - 20px, 100%); + } + + .promo-inner, + .section-head, + .listing-head, + .hero-actions, + .cart-row, + .order-head { + flex-direction: column; + align-items: flex-start; + } + + .header-top { + gap: 16px; + } + + .brand-lockup { + width: 100%; + justify-content: space-between; + } + + .header-actions { + width: 100%; + justify-content: flex-start; + } + + .thumb-row, + .detail-grid, + .range-row, + .card-form.two-col { + grid-template-columns: 1fr; + } + + .spec-table div, + .bundle-card { + grid-template-columns: 1fr; + } + + .cart-row { + grid-template-columns: 1fr; + } + + .product-card-media { + min-height: auto; + } +} diff --git a/sites/bh_photo/static/js/main.js b/sites/bh_photo/static/js/main.js new file mode 100644 index 000000000..8f41b41d9 --- /dev/null +++ b/sites/bh_photo/static/js/main.js @@ -0,0 +1,7 @@ +document.addEventListener("click", (event) => { + const button = event.target.closest("button, .cta, .ghost, .quiet-btn"); + if (button) { + button.classList.add("is-pressed"); + window.setTimeout(() => button.classList.remove("is-pressed"), 150); + } +}); diff --git a/sites/bh_photo/tasks.jsonl b/sites/bh_photo/tasks.jsonl new file mode 100644 index 000000000..0fead515d --- /dev/null +++ b/sites/bh_photo/tasks.jsonl @@ -0,0 +1,20 @@ +{"web_name": "B&H Photo", "id": "B&H Photo--0", "ques": "Use the search bar to find a full-frame Sony mirrorless camera with 33 MP and dual CFexpress A / SD media slots, then open the matching product page.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--1", "ques": "Browse Photography and filter for in-stock Sony mirrorless cameras under $2600. Identify the model that matches those filters.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/c/browse/Photography/ci/989/N/4294538916"} +{"web_name": "B&H Photo", "id": "B&H Photo--2", "ques": "Check the Used / Open-Box catalog and find the least expensive monitor priced under $900. Report the product you found.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--3", "ques": "Compare the Sony Aurora A7X, Canon Orbit R6 Mark II, and Nikon Zenith Z8 mirrorless cameras. Which one has the highest effective megapixel count?", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--4", "ques": "Compare the Sony Aurora A7X, Canon Orbit R6 Mark II, and Nikon Zenith Z8 mirrorless cameras, and determine which one lists the longest battery life.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--5", "ques": "Sign in as Alice Johnson with alice.j@test.com / TestPass123!, then save the Rode wireless microphone kit priced below $350 to her wishlist.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--6", "ques": "Sign in as Alice Johnson with alice.j@test.com / TestPass123! and add the Travel Vlog Essentials bundle to her cart.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--7", "ques": "Sign in as Alice Johnson with alice.j@test.com / TestPass123!, open the Fujifilm Northlight X-T5 Mirrorless Camera, and reserve it for pickup at NYC SuperStore.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--8", "ques": "Sign in as Alice Johnson with alice.j@test.com / TestPass123!, add the Rode Wireless Creator Duo to her cart, and change its cart quantity to 2.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--9", "ques": "Sign in as Alice Johnson with alice.j@test.com / TestPass123! and complete the mock checkout for her current cart until you reach the order confirmation page.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--10", "ques": "Sign in as Bob Chen with bob.c@test.com / TestPass123!, open order history, and find the order number for the purchase that includes the Sony FX30 Studio Cinema Camera.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--11", "ques": "Open the DJI Airframe 4S Fly More Drone Q&A page and find what the answer says about local store pickup support.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--12", "ques": "Use search to find the Apple creator laptop with a 1TB SSD and open the 14-inch model.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--13", "ques": "Compare the Apple CreatorBook 14 M3 Pro Laptop, Dell Precision Edge 16 Laptop, and ASUS ProArt Studio 13 OLED Laptop. Which one uses an Intel Core Ultra 9 processor?", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--14", "ques": "Find the lowest-priced active bundle under $1200 that includes a tripod, then open the bundle.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--15", "ques": "Open the BenQ SW272U Photo Monitor and determine whether the item is listed as new, used, or open-box.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--16", "ques": "Start from the Nikon Zenith Z8 mirrorless camera page, note the media type it uses, and then find a compatible 512GB storage card elsewhere in the catalog.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--17", "ques": "Sign in as David Kim with david.k@test.com / TestPass123!, check his orders, and identify which order is still processing.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--18", "ques": "Open the Rode Wireless Creator Duo reviews and report the headline of the top review shown on the page.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} +{"web_name": "B&H Photo", "id": "B&H Photo--19", "ques": "Sign in as Carol Davis with carol.d@test.com / TestPass123!, edit her account so SMS pickup alerts are enabled and the preferred pickup store is Los Angeles Creator Hub.", "web": "http://localhost:40015/", "upstream_url": "https://www.bhphotovideo.com/"} diff --git a/sites/bh_photo/templates/_product_card.html b/sites/bh_photo/templates/_product_card.html new file mode 100644 index 000000000..e114e57a6 --- /dev/null +++ b/sites/bh_photo/templates/_product_card.html @@ -0,0 +1,38 @@ +
+ + {{ product.name }} + {% if product.condition != 'New' %} + {{ product.condition }} + {% elif product.active_deal() %} + {{ product.active_deal().label }} + {% endif %} + +
+

{{ product.brand.name }} · {{ product.category.name }}

+

{{ product.name }}

+

{{ product.short_description }}

+
+ {{ product.average_review_label }} ★ + {{ product.review_count }} reviews +
+
+ {{ product.display_price|currency }} + {% if product.list_price > product.display_price %} + {{ product.list_price|currency }} + {{ product.savings_percent }}% off + {% endif %} +
+

{{ product.availability }}

+

{{ product.shipping_message }}

+
+
+ +
+ {% if current_user.is_authenticated %} +
+ +
+ {% endif %} +
+
+
diff --git a/sites/bh_photo/templates/account.html b/sites/bh_photo/templates/account.html new file mode 100644 index 000000000..7ea000307 --- /dev/null +++ b/sites/bh_photo/templates/account.html @@ -0,0 +1,44 @@ +{% extends "base.html" %} +{% block title %}Account · B&H Demo Mirror{% endblock %} +{% block content %} +
+

My account

+

{{ current_user.display_name }}

+

{{ current_user.role }} · {{ current_user.company }} · {{ current_user.email }}

+
+
+
+

Saved activity

+
    +
  • {{ current_user.wishlist_items|length }} wishlist items
  • +
  • {{ current_user.compare_items|length }} compare items
  • +
  • {{ current_user.cart_items|length }} cart lines
  • +
  • {{ current_user.orders|length }} orders
  • +
+
+
+

Pickup preference

+

{% if current_user.preferred_store_id %}Preferred store is saved for local demo reservations.{% else %}No preferred pickup store set yet.{% endif %}

+ Edit account preferences +
+
+

Recent reservations

+ {% if reservations %} +
    + {% for reservation in reservations %} +
  • {{ reservation.product.name }} · {{ reservation.store_location.name }}
  • + {% endfor %} +
+ {% else %} +

No active reservations.

+ {% endif %} +
+
+ +{% endblock %} diff --git a/sites/bh_photo/templates/account_edit.html b/sites/bh_photo/templates/account_edit.html new file mode 100644 index 000000000..6abcd898d --- /dev/null +++ b/sites/bh_photo/templates/account_edit.html @@ -0,0 +1,38 @@ +{% extends "base.html" %} +{% block title %}Edit Account · B&H Demo Mirror{% endblock %} +{% block content %} +
+
+

Edit account

+ + + + + + + + +
+
+{% endblock %} diff --git a/sites/bh_photo/templates/addresses.html b/sites/bh_photo/templates/addresses.html new file mode 100644 index 000000000..f563414e2 --- /dev/null +++ b/sites/bh_photo/templates/addresses.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} +{% block title %}Addresses · B&H Demo Mirror{% endblock %} +{% block content %} +
+

Saved addresses

+

Addresses

+
+
+ {% for address in addresses %} +
+

{{ address.label }}

+

{{ address.recipient }}

+

{{ address.line1 }}{% if address.line2 %}, {{ address.line2 }}{% endif %}

+

{{ address.city }}, {{ address.state }} {{ address.zip_code }}

+

{{ address.phone }}

+ {% if address.is_default %}Default{% endif %} +
+ {% endfor %} +
+{% endblock %} diff --git a/sites/bh_photo/templates/base.html b/sites/bh_photo/templates/base.html new file mode 100644 index 000000000..529c6698a --- /dev/null +++ b/sites/bh_photo/templates/base.html @@ -0,0 +1,99 @@ + + + + + + {% block title %}B&H Photo Demo Mirror{% endblock %} + + + +
+
+ Demo mirror only: all checkout, reservations, inventory, and orders use deterministic local benchmark data. + No live payment +
+
+ + + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} +
+ {% for category, message in messages %} +
{{ message }}
+ {% endfor %} +
+ {% endif %} + {% endwith %} + +
+ {% block content %}{% endblock %} +
+ + + + + + diff --git a/sites/bh_photo/templates/bundles.html b/sites/bh_photo/templates/bundles.html new file mode 100644 index 000000000..9f97e3620 --- /dev/null +++ b/sites/bh_photo/templates/bundles.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} +{% block title %}Bundles · B&H Demo Mirror{% endblock %} +{% block content %} +
+

Curated kits

+

Bundles

+

Pre-built creator kits with deterministic pricing, savings, and included item lists designed for cart and checkout benchmark tasks.

+
+
+ {% for bundle in bundles %} +
+ {{ bundle.title }} +
+

{{ bundle.badge }} · {{ bundle.audience }}

+

{{ bundle.title }}

+

{{ bundle.description }}

+ +
+ {{ bundle.bundle_price|currency }} + {{ bundle.list_price|currency }} + Save {{ bundle.savings|currency }} +
+ {% if current_user.is_authenticated %} +
+ +
+ {% endif %} +
+
+ {% endfor %} +
+{% endblock %} diff --git a/sites/bh_photo/templates/cart.html b/sites/bh_photo/templates/cart.html new file mode 100644 index 000000000..5640623c8 --- /dev/null +++ b/sites/bh_photo/templates/cart.html @@ -0,0 +1,47 @@ +{% extends "base.html" %} +{% block title %}Cart · B&H Demo Mirror{% endblock %} +{% block content %} +
+

Shopping cart

+

Cart

+
+
+
+ {% for item in items %} +
+ {{ item.product.name }} +
+

{{ item.product.name }}

+

{{ item.variant_label or item.bundle_label or 'Standard configuration' }}

+

{{ item.product.availability }}

+
+
+ + +
+ {{ item.line_total|currency }} +
+ +
+
+ {% else %} +
+

Your cart is empty

+

Add products or bundles to start a local demo checkout flow.

+
+ {% endfor %} +
+ +
+{% endblock %} diff --git a/sites/bh_photo/templates/categories.html b/sites/bh_photo/templates/categories.html new file mode 100644 index 000000000..0012f5786 --- /dev/null +++ b/sites/bh_photo/templates/categories.html @@ -0,0 +1,27 @@ +{% extends "base.html" %} +{% block title %}All Categories · B&H Demo Mirror{% endblock %} +{% block content %} +
+

Department index

+

All categories

+

Browse top-level departments and their subcategories with the same local benchmark data used in search, compare, wishlist, and checkout flows.

+
+
+ {% for category in categories %} + + {% endfor %} +
+{% endblock %} diff --git a/sites/bh_photo/templates/category_listing.html b/sites/bh_photo/templates/category_listing.html new file mode 100644 index 000000000..63cd191e9 --- /dev/null +++ b/sites/bh_photo/templates/category_listing.html @@ -0,0 +1,148 @@ +{% extends "base.html" %} +{% block title %}{{ page_title }} · B&H Demo Mirror{% endblock %} +{% block content %} +
+

{% if category %}{{ category.parent.name if category.parent else 'Department' }}{% elif brand %}Brand store{% else %}Catalog{% endif %}

+

{{ page_heading }}

+

{{ page_description }}

+
+ +
+ + +
+
+
+ {{ products|length }} results + {% if search_query %} +

Search query: {{ search_query }}

+ {% endif %} +
+
+ {% if request.args.get('brand') %}Brand: {{ request.args.get('brand') }}{% endif %} + {% if request.args.get('condition') %}{{ request.args.get('condition') }}{% endif %} + {% if request.args.get('availability') %}{{ request.args.get('availability') }}{% endif %} +
+
+
+ {% for product in products %} + {% include "_product_card.html" %} + {% else %} +
+

No matching demo products

+

Try widening the price range or clearing one of the filter constraints.

+
+ {% endfor %} +
+
+
+{% endblock %} diff --git a/sites/bh_photo/templates/checkout.html b/sites/bh_photo/templates/checkout.html new file mode 100644 index 000000000..b14674826 --- /dev/null +++ b/sites/bh_photo/templates/checkout.html @@ -0,0 +1,53 @@ +{% extends "base.html" %} +{% block title %}Checkout · B&H Demo Mirror{% endblock %} +{% block content %} +
+

Checkout mock

+

Checkout

+

No real payment or shipping is processed here. This is a local deterministic checkout flow for benchmark tasks.

+
+
+
+

Complete order

+ + + + + +
+ +
+{% endblock %} diff --git a/sites/bh_photo/templates/compare.html b/sites/bh_photo/templates/compare.html new file mode 100644 index 000000000..a739186f9 --- /dev/null +++ b/sites/bh_photo/templates/compare.html @@ -0,0 +1,50 @@ +{% extends "base.html" %} +{% block title %}Compare Products · B&H Demo Mirror{% endblock %} +{% block content %} +
+

Side-by-side workflow

+

Compare products

+

Review pricing, stock, and detailed technical rows across up to four products at once.

+
+ +
+ {% if products %} +
+ {% for product in products %} +
+ {{ product.name }} +

{{ product.name }}

+

{{ product.display_price|currency }} · {{ product.availability }}

+
+ +
+
+ {% endfor %} +
+
+ {% for group_name, rows in compare_rows.items() %} +
+

{{ group_name }}

+ + + {% for row in rows %} + + + {% for product in products %} + + {% endfor %} + + {% endfor %} + +
{{ row.name }}{{ row['cells'].get(product.id, '--') }}
+
+ {% endfor %} +
+ {% else %} +
+

No products in compare yet

+

Add products from listings or product pages to build a side-by-side comparison.

+
+ {% endif %} +
+{% endblock %} diff --git a/sites/bh_photo/templates/contact.html b/sites/bh_photo/templates/contact.html new file mode 100644 index 000000000..023649683 --- /dev/null +++ b/sites/bh_photo/templates/contact.html @@ -0,0 +1,31 @@ +{% extends "base.html" %} +{% block title %}Contact · B&H Demo Mirror{% endblock %} +{% block content %} +
+

Contact

+

Reach the local demo support desk

+

This form saves locally inside the benchmark environment. No real support ticket or external communication is created.

+
+
+
+ + + + + +
+
+{% endblock %} diff --git a/sites/bh_photo/templates/help.html b/sites/bh_photo/templates/help.html new file mode 100644 index 000000000..dd5dfe751 --- /dev/null +++ b/sites/bh_photo/templates/help.html @@ -0,0 +1,30 @@ +{% extends "base.html" %} +{% block title %}Help Center · B&H Demo Mirror{% endblock %} +{% block content %} +
+

Help center

+

Shipping, returns, pickup, and workflow help

+

These articles and policies are synthetic mirror content designed for benchmark tasks and local-only browsing.

+
+
+ {% for card in help_cards %} +
+

{{ card.title }}

+

{{ card.copy }}

+
+ {% endfor %} +
+
+
+
+

Popular gear

+

Products often referenced in help flows

+
+
+
+ {% for product in featured_products %} + {% include "_product_card.html" %} + {% endfor %} +
+
+{% endblock %} diff --git a/sites/bh_photo/templates/index.html b/sites/bh_photo/templates/index.html new file mode 100644 index 000000000..40d8f05fe --- /dev/null +++ b/sites/bh_photo/templates/index.html @@ -0,0 +1,159 @@ +{% extends "base.html" %} +{% block title %}B&H Photo Demo Mirror{% endblock %} +{% block content %} +
+
+
+

Creator gear, local only

+

Professional photo, video, audio, and computing workflows in a benchmark-ready B&H mirror.

+

Browse rich technical specs, compare models side by side, reserve pickup locally, and run a complete checkout flow without any external calls.

+ +
+
+
+

Today’s local mirror highlights

+
    +
  • 146 synthetic products with dense specs and compare-friendly rows
  • +
  • 20 bundles, 8 pickup locations, and deterministic checkout history
  • +
  • Used and open-box gear mixed into search, deals, and brand pages
  • +
+
+
+
+
+ +
+
+
+

Top categories

+

Browse by department

+
+ View all +
+ +
+ +
+
+
+

Featured gear

+

Popular creator picks

+
+ Search all gear +
+
+ {% for product in featured %} + {% include "_product_card.html" %} + {% endfor %} +
+
+ +
+ +
+
+
+

Used & open-box

+

Limited local stock

+
+ Browse used +
+ +
+
+ +
+
+
+

Bundle offers

+

Ready-to-ship creator kits

+
+ See all bundles +
+
+ {% for bundle in bundles %} +
+ {{ bundle.title }} +
+

{{ bundle.badge }} · {{ bundle.audience }}

+

{{ bundle.title }}

+

{{ bundle.description }}

+
+ {{ bundle.bundle_price|currency }} + {{ bundle.list_price|currency }} +
+ {% if current_user.is_authenticated %} +
+ +
+ {% endif %} +
+
+ {% endfor %} +
+
+ +
+
+
+

Workflow spotlight

+

Shopping flows covered in this mirror

+
+
+
+ {% for product in spotlight %} +
+ {{ product.name }} +

{{ product.name }}

+
    + {% for spec_name, spec_value in product.top_spec_map.items() %} + {% if loop.index0 < 3 %} +
  • {{ spec_name }}: {{ spec_value }}
  • + {% endif %} + {% endfor %} +
+
+ {% endfor %} +
+
+{% endblock %} diff --git a/sites/bh_photo/templates/login.html b/sites/bh_photo/templates/login.html new file mode 100644 index 000000000..c378aa950 --- /dev/null +++ b/sites/bh_photo/templates/login.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} +{% block title %}Sign In · B&H Demo Mirror{% endblock %} +{% block content %} +
+
+

Account access

+

Sign in

+

Use one of the seeded benchmark users or create a new local-only demo account.

+
+ + + +
+

Seeded benchmark password: TestPass123!

+

Create a demo account

+
+
+{% endblock %} diff --git a/sites/bh_photo/templates/order_receipt.html b/sites/bh_photo/templates/order_receipt.html new file mode 100644 index 000000000..7077f021d --- /dev/null +++ b/sites/bh_photo/templates/order_receipt.html @@ -0,0 +1,33 @@ +{% extends "base.html" %} +{% block title %}Order {{ order.order_number }} · B&H Demo Mirror{% endblock %} +{% block content %} +
+

Order confirmation

+

{{ order.order_number }}

+

{{ order.status }} · {{ order.fulfillment }} · {{ order.created_at.strftime('%b %d, %Y') }}

+
+
+
+

Order totals

+
+
Subtotal
{{ order.subtotal|currency }}
+
Shipping
{{ order.shipping|currency }}
+
Tax
{{ order.tax|currency }}
+
Total
{{ order.total|currency }}
+
+

{{ order.note }}

+
+
+ {% for item in order.items %} +
+ {{ item.product_name }} +
+

{{ item.product_name }}

+

{{ item.variant_label }}

+
+ {{ item.price|currency }} +
+ {% endfor %} +
+
+{% endblock %} diff --git a/sites/bh_photo/templates/orders.html b/sites/bh_photo/templates/orders.html new file mode 100644 index 000000000..5aa87d625 --- /dev/null +++ b/sites/bh_photo/templates/orders.html @@ -0,0 +1,37 @@ +{% extends "base.html" %} +{% block title %}Orders · B&H Demo Mirror{% endblock %} +{% block content %} +
+

Order history

+

Orders

+
+
+ {% for order in orders %} + + {% endfor %} +
+{% endblock %} diff --git a/sites/bh_photo/templates/product_detail.html b/sites/bh_photo/templates/product_detail.html new file mode 100644 index 000000000..32f536839 --- /dev/null +++ b/sites/bh_photo/templates/product_detail.html @@ -0,0 +1,177 @@ +{% extends "base.html" %} +{% block title %}{{ product.name }} · B&H Demo Mirror{% endblock %} +{% block content %} + + +
+ +
+

{{ product.brand.name }} · {{ product.category.name }}

+

{{ product.name }}

+
+ {{ product.average_review_label }} ★ + {{ product.review_count }} reviews + {{ product.qa_count }} Q&A +
+

{{ product.short_description }}

+
+ {% for spec_name, spec_value in top_specs %} + {{ spec_name }}: {{ spec_value }} + {% endfor %} +
+ + + {% if active_tab == 'overview' %} +
+

{{ product.description }}

+
+ {% for group in product.spec_groups[:2] %} +
+

{{ group.title }}

+
    + {% for spec in group.specs[:4] %} +
  • {{ spec.name }}: {{ spec.value }}
  • + {% endfor %} +
+
+ {% endfor %} +
+
+ {% elif active_tab == 'specs' %} +
+ {% for group in product.spec_groups %} +
+

{{ group.title }}

+
+ {% for spec in group.specs %} +
+
{{ spec.name }}
+
{{ spec.value }}
+
+ {% endfor %} +
+
+ {% endfor %} +
+ {% elif active_tab == 'reviews' %} +
+ {% for review in product.reviews %} +
+
+ {{ review.rating }} ★ + {{ review.author_name }} + {{ review.created_at.strftime('%b %d, %Y') }} +
+

{{ review.headline }}

+

{{ review.body }}

+
+ {% endfor %} +
+ {% else %} +
+ {% for question in product.questions %} +
+

Q: {{ question.question }}

+

Asked by {{ question.asker_name }} on {{ question.created_at.strftime('%b %d, %Y') }}

+ {% for answer in question.answers %} +

A: {{ answer.answer }}

+ {% endfor %} +
+ {% endfor %} +
+ {% endif %} +
+ +
+ +
+
+
+

Related picks

+

Similar products in this category

+
+
+
+ {% for product in related %} + {% include "_product_card.html" %} + {% endfor %} +
+
+{% endblock %} diff --git a/sites/bh_photo/templates/register.html b/sites/bh_photo/templates/register.html new file mode 100644 index 000000000..f30e1696d --- /dev/null +++ b/sites/bh_photo/templates/register.html @@ -0,0 +1,49 @@ +{% extends "base.html" %} +{% block title %}Register · B&H Demo Mirror{% endblock %} +{% block content %} +
+
+

Local-only account

+

Create a demo account

+
+ + + + + + + + + + + + + +
+
+
+{% endblock %} diff --git a/sites/bh_photo/templates/store_pickup.html b/sites/bh_photo/templates/store_pickup.html new file mode 100644 index 000000000..4dac8fa34 --- /dev/null +++ b/sites/bh_photo/templates/store_pickup.html @@ -0,0 +1,70 @@ +{% extends "base.html" %} +{% block title %}Store Pickup · B&H Demo Mirror{% endblock %} +{% block content %} +
+

Reserve-in-store mock

+

Store pickup

+

Review deterministic store inventory and reserve pickup locally. This flow never contacts live B&H systems or any real stores.

+
+ +
+
+ {% if product %} +
+

{{ product.name }}

+

{{ inventory|length }} locations currently show pickup inventory for this item.

+
+ {% for item in inventory %} +
+

{{ item.store_location.name }}

+

{{ item.store_location.city }}, {{ item.store_location.state }}

+

{{ item.quantity }} available · {{ item.pickup_eta }}

+
+ {% endfor %} +
+
+ {% endif %} + +
+
+

Pickup-eligible gear

+

Popular local-only reservation items

+
+
+
+ {% for product in featured %} + {% include "_product_card.html" %} + {% endfor %} +
+
+ +
+{% endblock %} diff --git a/sites/bh_photo/templates/wishlist.html b/sites/bh_photo/templates/wishlist.html new file mode 100644 index 000000000..723dd5989 --- /dev/null +++ b/sites/bh_photo/templates/wishlist.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} +{% block title %}Wishlist · B&H Demo Mirror{% endblock %} +{% block content %} +
+

Saved gear

+

Wishlist

+
+
+ {% for item in items %} + {% set product = item.product %} + {% include "_product_card.html" %} + {% else %} +
+

Your wishlist is empty

+

Save items from category pages or product detail views.

+
+ {% endfor %} +
+{% endblock %} diff --git a/websyn_start.sh b/websyn_start.sh index 72defad8b..2b05c887a 100644 --- a/websyn_start.sh +++ b/websyn_start.sh @@ -1,11 +1,11 @@ #!/bin/bash -# WebSyn startup: launch all 12 mirror sites, then exec the original CMD. +# WebSyn startup: launch all registered mirror sites, then exec the original CMD. # This preserves the base image's browser env server (port 8100) as PID 1. set -e SITES=(allrecipes amazon apple arxiv bbc_news booking github google_flights google_map google_search huggingface wolfram_alpha - cambridge_dictionary coursera espn) + cambridge_dictionary coursera espn bh_photo) BASE_PORT=40000 PID_DIR=/tmp/websyn_pids mkdir -p "$PID_DIR" @@ -17,7 +17,7 @@ for d in "${SITES[@]}"; do cp -a "/opt/WebSyn/$d/instance_seed" "/opt/WebSyn/$d/instance" done -echo "[WebSyn] Starting 15 sites on ports ${BASE_PORT}-$((BASE_PORT + 14))..." +echo "[WebSyn] Starting 16 sites on ports ${BASE_PORT}-$((BASE_PORT + 15))..." for i in "${!SITES[@]}"; do site="${SITES[$i]}" port=$((BASE_PORT + i)) @@ -51,8 +51,8 @@ except Exception: exit(1) ready=$((ready + 1)) fi done - echo " [${elapsed}/${max_wait}s] ${ready}/15 sites ready" - if [ $ready -eq 15 ]; then + echo " [${elapsed}/${max_wait}s] ${ready}/16 sites ready" + if [ $ready -eq 16 ]; then break fi done @@ -78,6 +78,6 @@ done echo "[WebSyn] Starting control server on :8101 (PID 1)..." # Control server becomes PID 1 — receives SIGTERM on `docker stop`, -# keeps the container alive as long as it's running. The 15 site +# keeps the container alive as long as it's running. The 16 site # subprocesses are managed via /tmp/websyn_pids/.pid. exec python3 /opt/control_server.py --port 8101 From 11dca9f4d51bbd15a2ca303dad270113ec1dd013 Mon Sep 17 00:00:00 2001 From: JackJin <1037461232@qq.com> Date: Sun, 13 Sep 2026 00:17:23 +0800 Subject: [PATCH 02/29] fix(bh_photo): validate form numbers and serve a favicon Malformed quantity/store_id values raised ValueError inside the cart and reserve handlers, so a benchmark agent typing text into a number field got an HTTP 500 instead of a visible error. parse_positive_int() now rejects non-numeric input and each handler flashes a validation message and redirects without writing to the database. Every page also requested /favicon.ico and got a 404; the site now ships sites/bh_photo/static/icons/favicon.svg, links it from base.html, and serves it at /favicon.ico. Adds sites/bh_photo/tests/test_functional_contract.py covering both rejected and accepted input for all three handlers plus the favicon (7 tests, red before this change). --- sites/bh_photo/app.py | 43 +++- sites/bh_photo/static/icons/favicon.svg | 5 + sites/bh_photo/templates/base.html | 1 + .../tests/test_functional_contract.py | 192 ++++++++++++++++++ 4 files changed, 237 insertions(+), 4 deletions(-) create mode 100644 sites/bh_photo/static/icons/favicon.svg create mode 100644 sites/bh_photo/tests/test_functional_contract.py diff --git a/sites/bh_photo/app.py b/sites/bh_photo/app.py index c953b1bbf..ea6dfaa1c 100644 --- a/sites/bh_photo/app.py +++ b/sites/bh_photo/app.py @@ -10,6 +10,7 @@ redirect, render_template, request, + send_from_directory, session, url_for, ) @@ -1230,7 +1231,10 @@ def cart(): @login_required def add_to_cart(product_slug: str): product = Product.query.filter_by(slug=product_slug).first_or_404() - quantity = max(int(request.form.get("quantity", 1) or 1), 1) + quantity = parse_positive_int(request.form.get("quantity")) + if quantity is None: + flash("Enter a valid quantity as a whole number.", "danger") + return redirect(request.referrer or url_for("product_detail", product_slug=product.slug)) variant_label = request.form.get("variant_label", "").strip() existing = CartItem.query.filter_by( user_id=current_user.id, @@ -1258,7 +1262,10 @@ def add_to_cart(product_slug: str): @login_required def update_cart(item_id: int): item = CartItem.query.filter_by(id=item_id, user_id=current_user.id).first_or_404() - quantity = max(int(request.form.get("quantity", 1) or 1), 1) + quantity = parse_positive_int(request.form.get("quantity")) + if quantity is None: + flash("Enter a valid quantity as a whole number.", "danger") + return redirect(url_for("cart")) item.quantity = quantity db.session.commit() flash("Your cart quantity was updated.", "success") @@ -1279,8 +1286,14 @@ def remove_cart_item(item_id: int): @login_required def reserve_store_pickup(product_slug: str): product = Product.query.filter_by(slug=product_slug).first_or_404() - store_id = int(request.form.get("store_id", 0) or 0) - quantity = max(int(request.form.get("quantity", 1) or 1), 1) + store_id = parse_positive_int(request.form.get("store_id"), default=0) + if store_id is None: + flash("Choose a pickup store from the list.", "danger") + return redirect(url_for("store_pickup", product=product.slug)) + quantity = parse_positive_int(request.form.get("quantity")) + if quantity is None: + flash("Enter a valid quantity as a whole number.", "danger") + return redirect(url_for("store_pickup", product=product.slug)) inventory = StoreInventory.query.filter_by(product_id=product.id, store_id=store_id).first() if not inventory or inventory.quantity < quantity: flash("That pickup slot is no longer available in this demo inventory.", "danger") @@ -1359,6 +1372,28 @@ def contact_support_redirect(): return redirect(url_for("contact")) +def parse_positive_int(raw, default: int = 1) -> int | None: + """Return a >=1 integer from form input, or None when it is not a number. + + Callers turn None into a visible validation message; the site must never + raise a 500 because a form field carried text instead of digits. + """ + if raw is None or str(raw).strip() == "": + return default + try: + value = int(str(raw).strip()) + except (TypeError, ValueError): + return None + return max(value, 1) + + +@app.route("/favicon.ico") +def favicon(): + return send_from_directory( + os.path.join(app.static_folder, "icons"), "favicon.svg", mimetype="image/svg+xml" + ) + + @app.route("/_health") def health(): return {"ok": True, "site": "bh_photo"} diff --git a/sites/bh_photo/static/icons/favicon.svg b/sites/bh_photo/static/icons/favicon.svg new file mode 100644 index 000000000..1e5a235be --- /dev/null +++ b/sites/bh_photo/static/icons/favicon.svg @@ -0,0 +1,5 @@ + + + + B&H + diff --git a/sites/bh_photo/templates/base.html b/sites/bh_photo/templates/base.html index 529c6698a..ebfe1f431 100644 --- a/sites/bh_photo/templates/base.html +++ b/sites/bh_photo/templates/base.html @@ -4,6 +4,7 @@ {% block title %}B&H Photo Demo Mirror{% endblock %} + diff --git a/sites/bh_photo/tests/test_functional_contract.py b/sites/bh_photo/tests/test_functional_contract.py new file mode 100644 index 000000000..7e5dd2b16 --- /dev/null +++ b/sites/bh_photo/tests/test_functional_contract.py @@ -0,0 +1,192 @@ +"""Regression tests for the closed B&H Photo functional findings. + +Run with ``python -m unittest discover -s sites/bh_photo/tests -v``. +When running this file from elsewhere, set BH_PHOTO_SOURCE to the site +directory. Source files are copied into a TemporaryDirectory before import; +no source, runtime, or seed database is opened or modified. +""" + +import importlib.util +import os +import shutil +import sys +import tempfile +import types +import unittest +from pathlib import Path + + +class SiteFixture(unittest.TestCase): + """Boots the real app against a throwaway SQLite DB with a tiny catalog.""" + + @classmethod + def setUpClass(cls): + source_override = os.environ.get('BH_PHOTO_SOURCE') + source = Path(source_override) if source_override else Path(__file__).resolve().parents[1] + if not (source / 'app.py').is_file(): + raise RuntimeError('Set BH_PHOTO_SOURCE to the B&H Photo site directory') + cls.scratch = tempfile.TemporaryDirectory(prefix='bh-photo-contract-') + cls.addClassCleanup(cls.scratch.cleanup) + fixture = Path(cls.scratch.name) + shutil.copy2(source / 'app.py', fixture / 'app.py') + shutil.copytree(source / 'templates', fixture / 'templates') + shutil.copytree(source / 'static', fixture / 'static') + + # The only stub is the seed loader: the real app creates its normal + # schema in the scratch directory and every request uses real routes. + seed_stub = types.ModuleType('seed_data') + seed_stub.seed_database = lambda *args, **kwargs: None + seed_stub.seed_benchmark_users = lambda *args, **kwargs: None + module_name = '_bh_photo_functional_fixture' + spec = importlib.util.spec_from_file_location(module_name, fixture / 'app.py') + cls.site = importlib.util.module_from_spec(spec) + sys.modules[module_name] = cls.site + cls.addClassCleanup(sys.modules.pop, module_name, None) + previous_seed_module = sys.modules.get('seed_data') + sys.modules['seed_data'] = seed_stub + try: + spec.loader.exec_module(cls.site) + finally: + if previous_seed_module is None: + sys.modules.pop('seed_data', None) + else: + sys.modules['seed_data'] = previous_seed_module + + cls.app = cls.site.app + cls.app.config['TESTING'] = True + cls.db = cls.site.db + with cls.app.app_context(): + cls._seed_minimal_catalog() + + @classmethod + def _seed_minimal_catalog(cls): + s, db = cls.site, cls.db + category = s.Category(name='Mirrorless Cameras', slug='mirrorless-cameras') + brand = s.Brand(name='Testbrand', slug='testbrand') + db.session.add_all([category, brand]) + db.session.flush() + store = s.StoreLocation( + name='Test Pickup Counter', slug='test-pickup-counter', city='New York', + state='NY', address='1 Test Plaza', pickup_hours='9-5', + ) + product = s.Product( + category_id=category.id, brand_id=brand.id, name='Test Camera', + slug='test-camera', sku='BHTEST1', price=100.0, condition='New', + availability='In Stock', stock_level=5, top_category_slug='photography', + subcategory_slug='mirrorless-cameras', product_type='Mirrorless Camera', + ) + user = s.User(email='tester@test.com', username='tester', display_name='Tester') + user.set_password('TestPass123!') + db.session.add_all([store, product, user]) + db.session.flush() + db.session.add(s.StoreInventory( + store_id=store.id, product_id=product.id, quantity=3, pickup_eta='Ready in 2 hours', + )) + db.session.commit() + cls.product_slug, cls.store_id, cls.user_email = product.slug, store.id, user.email + + def signed_in_client(self): + client = self.app.test_client() + response = client.post( + '/login', + data={'email': self.user_email, 'password': 'TestPass123!'}, + follow_redirects=False, + ) + self.assertEqual(response.status_code, 302, 'benchmark sign-in must succeed') + return client + + def cart_rows(self): + with self.app.app_context(): + return self.site.CartItem.query.count() + + def reservation_rows(self): + with self.app.app_context(): + return self.site.StoreReservation.query.count() + + +class MalformedNumericInputTests(SiteFixture): + """Malformed numbers must produce a visible error, never an HTTP 500. + + Closes the two unhandled ``int()`` conversions found at S1 on the + original contribution (app.py add_to_cart / update_cart / reserve). + """ + + def test_cart_add_rejects_non_numeric_quantity(self): + client = self.signed_in_client() + before = self.cart_rows() + response = client.post( + f'/cart/add/{self.product_slug}', data={'quantity': 'abc'}, follow_redirects=True, + ) + self.assertEqual(response.status_code, 200) + self.assertIn('valid quantity', response.get_data(as_text=True).lower()) + self.assertEqual(self.cart_rows(), before, 'rejected input must not write a cart row') + + def test_cart_add_accepts_valid_quantity(self): + client = self.signed_in_client() + before = self.cart_rows() + response = client.post( + f'/cart/add/{self.product_slug}', data={'quantity': '2'}, follow_redirects=True, + ) + self.assertEqual(response.status_code, 200) + self.assertEqual(self.cart_rows(), before + 1) + + def test_cart_update_rejects_non_numeric_quantity(self): + client = self.signed_in_client() + client.post(f'/cart/add/{self.product_slug}', data={'quantity': '1'}) + with self.app.app_context(): + item = self.site.CartItem.query.order_by(self.site.CartItem.id.desc()).first() + item_id, before_quantity = item.id, item.quantity + response = client.post( + f'/cart/update/{item_id}', data={'quantity': 'abc'}, follow_redirects=True, + ) + self.assertEqual(response.status_code, 200) + self.assertIn('valid quantity', response.get_data(as_text=True).lower()) + with self.app.app_context(): + self.assertEqual( + self.site.CartItem.query.get(item_id).quantity, before_quantity, + 'rejected input must not change the stored quantity', + ) + + def test_reserve_rejects_non_numeric_store(self): + client = self.signed_in_client() + before = self.reservation_rows() + response = client.post( + f'/reserve/{self.product_slug}', + data={'store_id': 'abc', 'quantity': '1'}, follow_redirects=True, + ) + self.assertEqual(response.status_code, 200) + self.assertIn('pickup store', response.get_data(as_text=True).lower()) + self.assertEqual(self.reservation_rows(), before, 'rejected input must not reserve') + + def test_reserve_rejects_non_numeric_quantity(self): + client = self.signed_in_client() + before = self.reservation_rows() + response = client.post( + f'/reserve/{self.product_slug}', + data={'store_id': str(self.store_id), 'quantity': 'abc'}, follow_redirects=True, + ) + self.assertEqual(response.status_code, 200) + self.assertIn('valid quantity', response.get_data(as_text=True).lower()) + self.assertEqual(self.reservation_rows(), before, 'rejected input must not reserve') + + def test_reserve_accepts_valid_input(self): + client = self.signed_in_client() + before = self.reservation_rows() + response = client.post( + f'/reserve/{self.product_slug}', + data={'store_id': str(self.store_id), 'quantity': '1'}, follow_redirects=True, + ) + self.assertEqual(response.status_code, 200) + self.assertEqual(self.reservation_rows(), before + 1) + + +class StaticAssetTests(SiteFixture): + def test_favicon_is_served(self): + """Every page requested /favicon.ico and got a 404 at S1.""" + response = self.app.test_client().get('/favicon.ico') + self.assertEqual(response.status_code, 200) + self.assertGreater(len(response.get_data()), 0) + + +if __name__ == '__main__': + unittest.main() From cc8b0df8f3782e603c4bef137b228b2385ddbf74 Mon Sep 17 00:00:00 2001 From: JackJin <1037461232@qq.com> Date: Sun, 13 Sep 2026 00:25:54 +0800 Subject: [PATCH 03/29] fix(bh_photo): stop card grids overflowing narrow viewports At 320px the auto-fit tracks kept their pixel minimum (bundle cards held 320px inside a 300px shell), so the page scrolled horizontally. Wrapping each minimum in min(, 100%) keeps the desktop track and lets the card collapse to the container on small screens. Verified with Chromium over 10 page templates x 1440/768/390/320: no page scrolls horizontally and no element escapes the viewport outside the intentionally scrollable nav row. --- sites/bh_photo/static/css/main.css | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sites/bh_photo/static/css/main.css b/sites/bh_photo/static/css/main.css index 6a76eca93..79b8930bd 100644 --- a/sites/bh_photo/static/css/main.css +++ b/sites/bh_photo/static/css/main.css @@ -398,19 +398,19 @@ textarea { } .category-grid { - grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(min(180px, 100%), 1fr)); } .product-grid { - grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr)); } .product-grid.dense { - grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(min(220px, 100%), 1fr)); } .bundle-grid { - grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(min(320px, 100%), 1fr)); } .bundle-grid.tall { @@ -418,7 +418,7 @@ textarea { } .spotlight-grid { - grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(min(260px, 100%), 1fr)); } .category-tile, @@ -808,7 +808,7 @@ textarea { .compare-top { display: grid; - grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(min(220px, 100%), 1fr)); gap: 18px; margin-bottom: 24px; } @@ -879,7 +879,7 @@ textarea { .address-grid, .help-grid, .dashboard-grid { - grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr)); } .pickup-card, From f0acfb79811bd0c082b20057b2629b220b85e42e Mon Sep 17 00:00:00 2001 From: JackJin <1037461232@qq.com> Date: Sun, 13 Sep 2026 00:49:30 +0800 Subject: [PATCH 04/29] style(bh_photo): match the upstream B&H header, nav and footer The mirror used a dark-green header, a yellow logo tile and a yellow promo banner. None of that matches bhphotovideo.com. Values here are measured on the Internet Archive capture 20260909004043 of the upstream home page, because the live site answers automation with a bot challenge: page background #ffffff department nav #3f9a59, 32px tall body text #000 / #666 nav links white 14px, Used #e0f2aa logo fills #bd2c26 #ffc745 at 98x60 content container 1350px footer #f2f2f2 link accent #007ab8 The header becomes a white band with a red-bordered B&H lockup and a bordered white search field, the department strip becomes the green bar carrying Used and Specials, and the footer becomes light grey. The demo disclosure stays but moves into the slim utility strip upstream has in that position. The logo is drawn from the upstream fills and proportions rather than copied from the upstream SVG path. Checked over 12 page templates x 1440/768/390/320: all 200, no page scrolls horizontally, no broken images. --- sites/bh_photo/static/css/main.css | 165 +++++++++++++++++++---------- sites/bh_photo/templates/base.html | 4 +- 2 files changed, 113 insertions(+), 56 deletions(-) diff --git a/sites/bh_photo/static/css/main.css b/sites/bh_photo/static/css/main.css index 79b8930bd..4dc0218d7 100644 --- a/sites/bh_photo/static/css/main.css +++ b/sites/bh_photo/static/css/main.css @@ -1,19 +1,27 @@ :root { - --bg: #eef2ef; + /* Palette measured on the Internet Archive capture of bhphotovideo.com + (20260909004043): page #ffffff, department nav #3f9a59, footer #f2f2f2, + logo fills #bd2c26 / #ffc745, body text #000, secondary text #666, + link accent #007ab8, content container 1350px. */ + --bg: #ffffff; --paper: #ffffff; - --paper-alt: #f6f7f7; - --text: #1b2327; - --muted: #5d6b72; - --border: #d7dfdd; - --brand-dark: #2d382f; - --brand-deep: #213129; - --brand-gold: #f1c74b; - --brand-green: #2d7a5d; + --paper-alt: #f7f7f7; + --text: #1a1a1a; + --muted: #666666; + --border: #d9d9d9; + --brand-red: #bd2c26; + --brand-gold: #ffc745; + --brand-green: #3f9a59; + --brand-green-dark: #35824b; + --nav-accent: #e0f2aa; + --brand-dark: #333333; + --brand-deep: #007ab8; + --brand-blue: #007ab8; --brand-orange: #cb6a2b; - --brand-blue: #2f5f8f; + --footer-bg: #f2f2f2; --danger: #b14141; - --shadow: 0 18px 45px rgba(26, 39, 36, 0.08); - --radius: 18px; + --shadow: 0 1px 3px rgba(0, 0, 0, 0.12); + --radius: 4px; } * { @@ -22,9 +30,11 @@ body { margin: 0; - font-family: "Segoe UI", "Helvetica Neue", Arial, sans-serif; + /* Upstream serves OpenSans as a webfont; the mirror ships no webfont and + falls back to the same stack the upstream CSS declares after it. */ + font-family: "Open Sans", "Segoe UI", Helvetica, Roboto, Arial, sans-serif; color: var(--text); - background: radial-gradient(circle at top left, #f7fbf9 0, var(--bg) 38%, #e7ece8 100%); + background: var(--bg); } a { @@ -45,14 +55,15 @@ textarea { } .shell { - width: min(1240px, calc(100vw - 32px)); + width: min(1350px, calc(100vw - 32px)); margin: 0 auto; } .promo-strip { - background: linear-gradient(90deg, #f8d762, #efc541); - color: #372b08; - font-size: 14px; + background: #ffffff; + color: var(--muted); + font-size: 12px; + border-bottom: 1px solid #ececec; } .promo-inner { @@ -60,7 +71,7 @@ textarea { justify-content: space-between; align-items: center; gap: 16px; - padding: 10px 0; + padding: 6px 0; } .promo-pill, @@ -77,18 +88,20 @@ textarea { } .promo-pill { - background: rgba(55, 43, 8, 0.12); + background: #f2f2f2; + color: var(--muted); + font-weight: 600; } .count-chip { - background: rgba(255, 255, 255, 0.14); + background: #eeeeee; + color: var(--text); min-width: 24px; } .site-header { - background: linear-gradient(180deg, var(--brand-dark), var(--brand-deep)); - color: #f1f5f2; - box-shadow: 0 10px 25px rgba(18, 25, 20, 0.18); + background: #ffffff; + color: var(--text); } .header-top { @@ -96,7 +109,7 @@ textarea { grid-template-columns: auto 1fr auto; gap: 24px; align-items: center; - padding: 18px 0; + padding: 14px 0; } .brand-lockup { @@ -109,13 +122,24 @@ textarea { display: inline-flex; align-items: center; justify-content: center; - width: 82px; - height: 52px; - border-radius: 16px; - background: var(--brand-gold); - color: #2d2711; - font-size: 28px; - font-weight: 900; + flex-direction: column; + width: 98px; + height: 60px; + border: 2px solid var(--brand-red); + background: #ffffff; + color: var(--brand-red); + font-size: 26px; + font-weight: 800; + line-height: 1; +} + +.brand-mark span { + display: block; + margin-top: 3px; + font-size: 7px; + font-weight: 700; + letter-spacing: 0.14em; + color: var(--brand-red); } .brand-copy strong { @@ -123,8 +147,12 @@ textarea { font-size: 21px; } +.brand-copy strong { + color: var(--text); +} + .brand-copy small { - color: rgba(241, 245, 242, 0.76); + color: var(--muted); letter-spacing: 0.08em; text-transform: uppercase; } @@ -132,23 +160,24 @@ textarea { .search-bar { display: flex; align-items: center; - background: rgba(255, 255, 255, 0.11); - padding: 8px; - border-radius: 999px; - border: 1px solid rgba(255, 255, 255, 0.08); + background: #ffffff; + padding: 0; + border-radius: var(--radius); + border: 1px solid #c6c6c6; + overflow: hidden; } .search-bar input { border: 0; outline: 0; background: transparent; - color: #fff; + color: var(--text); width: 100%; - padding: 0 16px; + padding: 11px 14px; } .search-bar input::placeholder { - color: rgba(255, 255, 255, 0.7); + color: #8a8a8a; } .search-bar button, @@ -161,12 +190,21 @@ textarea { transition: transform 0.15s ease, opacity 0.15s ease, background 0.2s ease; } -.search-bar button, +.search-bar button { + background: #ffffff; + color: var(--muted); + padding: 11px 18px; + font-weight: 600; + border-left: 1px solid #e4e4e4; + border-radius: 0; +} + .cta { - background: var(--brand-gold); - color: #2d2711; - padding: 12px 22px; - font-weight: 800; + background: var(--brand-green); + color: #ffffff; + padding: 11px 22px; + font-weight: 700; + border-radius: var(--radius); } .ghost { @@ -199,22 +237,33 @@ textarea { .header-actions { display: flex; align-items: center; - gap: 14px; - font-size: 14px; + gap: 18px; + font-size: 13px; + color: var(--brand-dark); } .primary-nav { - border-top: 1px solid rgba(255, 255, 255, 0.08); + background: var(--brand-green); + color: #ffffff; } .nav-row { display: flex; align-items: center; - gap: 18px; - padding: 13px 0; + gap: 20px; + min-height: 32px; + padding: 0; overflow-x: auto; white-space: nowrap; - font-size: 15px; + font-size: 14px; +} + +.nav-row a:hover { + text-decoration: underline; +} + +.nav-row a.nav-accent { + color: var(--nav-accent); } .flash-stack { @@ -1021,9 +1070,10 @@ textarea { } .site-footer { - margin-top: 56px; - background: var(--brand-deep); - color: #f1f5f2; + margin-top: 48px; + background: var(--footer-bg); + color: var(--text); + border-top: 1px solid #e2e2e2; } .footer-grid { @@ -1036,7 +1086,12 @@ textarea { .footer-grid p, .footer-grid li, .footer-grid a { - color: rgba(241, 245, 242, 0.82); + color: var(--muted); +} + +.footer-grid a:hover { + color: var(--brand-blue); + text-decoration: underline; } .empty-state { diff --git a/sites/bh_photo/templates/base.html b/sites/bh_photo/templates/base.html index ebfe1f431..c9ba93dc8 100644 --- a/sites/bh_photo/templates/base.html +++ b/sites/bh_photo/templates/base.html @@ -17,7 +17,7 @@ From aa7352e00881462a3b8805b274de65198ec5db64 Mon Sep 17 00:00:00 2001 From: JackJin <1037461232@qq.com> Date: Sun, 13 Sep 2026 01:27:45 +0800 Subject: [PATCH 05/29] feat(bh_photo): rebuild the catalog from sourced B&H data The contribution shipped an entirely invented catalog: remixed product names ("Sony Aurora A7X", "Canon Orbit R6 Mark II"), generated specs and prices, and 167 SVG line drawings. No task fact could be checked against bhphotovideo.com, and the project's own reviewer checklist asks for real product imagery rather than placeholders. Catalog facts now come from dated Internet Archive captures of bhphotovideo.com, because the live site answers automated requests with a bot challenge. sources/harvest.py reads the archive index, parses the JSON-LD product block and the published specification table, and pulls the product photography the captured page showed. sources/build_manifest.py selects the shelf, derives the listing facets from published spec rows only, and writes source_catalog.json with a capture URL and timestamp on every product. seed_data.py builds the database from that manifest. 128 products, 50+ brands, real B&H SKUs and MPNs, real prices real availability including backordered and discontinued 4300+ specification rows taken from the published tables archived product photography where the archive holds it Accounts, reviews, questions, bundles, carts, orders, reservations and the used/open-box shelf stay generated, and both the manifest and the module docstring say so. A field the source does not state is stored empty rather than invented; products whose photo is not archived show a placeholder that says so. Two reproducibility defects are fixed with it. Benchmark accounts hashed with bcrypt's random salt, so the shipped database could never be regenerated from source; they now use PBKDF2 over a derived fixed salt while live registrations keep bcrypt. Index DDL was emitted in set order, so two builds of identical data produced different bytes; indexes are now recreated by name and the file is vacuumed. Six consecutive rebuilds are byte-identical, and a boot on a populated database still leaves the file untouched, so the reset invariant holds. Product cards also showed a review count that did not match the reviews on the page (188 claimed, 2 present); the badge is now the number of rows actually created. The store list drops from eight invented locations to the single B&H counter the upstream footer states (420 9th Ave, New York). The home page loses the marketing hero and the "146 synthetic products" card in favour of the department row with product photography that upstream shows in that position. --- sites/bh_photo/app.py | 24 + sites/bh_photo/asset_inventory.json | 826 + sites/bh_photo/seed_data.py | 1926 +- sites/bh_photo/source_catalog.json | 25896 ++++++++++++++++ sites/bh_photo/sources/build_manifest.py | 307 + sites/bh_photo/sources/harvest.py | 405 + sites/bh_photo/static/css/main.css | 58 + .../static/icons/product-placeholder.svg | 10 + sites/bh_photo/templates/index.html | 47 +- 9 files changed, 27978 insertions(+), 1521 deletions(-) create mode 100644 sites/bh_photo/asset_inventory.json create mode 100644 sites/bh_photo/source_catalog.json create mode 100644 sites/bh_photo/sources/build_manifest.py create mode 100644 sites/bh_photo/sources/harvest.py create mode 100644 sites/bh_photo/static/icons/product-placeholder.svg diff --git a/sites/bh_photo/app.py b/sites/bh_photo/app.py index ea6dfaa1c..7c17ac299 100644 --- a/sites/bh_photo/app.py +++ b/sites/bh_photo/app.py @@ -15,6 +15,7 @@ url_for, ) from flask_bcrypt import Bcrypt +from werkzeug.security import check_password_hash from flask_login import ( LoginManager, UserMixin, @@ -86,9 +87,18 @@ class User(db.Model, UserMixin): search_logs = db.relationship("SearchLog", backref="user", lazy=True, cascade="all, delete-orphan") def set_password(self, password: str) -> None: + """Hash a password chosen at runtime. + + Accounts registered through the site use bcrypt. Benchmark accounts are + written by the seed with a PBKDF2 hash over a derived, fixed salt, so the + shipped database can be regenerated byte for byte from source; bcrypt + salts randomly and made that impossible. + """ self.password_hash = bcrypt.generate_password_hash(password).decode("utf-8") def check_password(self, password: str) -> bool: + if self.password_hash.startswith("pbkdf2:"): + return check_password_hash(self.password_hash, password) return bcrypt.check_password_hash(self.password_hash, password) @@ -801,6 +811,19 @@ def index(): bundles = Bundle.query.order_by(Bundle.featured.desc(), Bundle.title).limit(4).all() categories = Category.query.filter_by(parent_id=None).order_by(Category.nav_order).all() spotlight = Product.query.filter_by(is_bundle_anchor=True).order_by(Product.best_seller_rank).limit(4).all() + # upstream fronts each department with a product photo, so pick one archived + # image per department for the department tiles + department_images = {} + for category in categories: + sample = ( + Product.query.filter( + Product.top_category_slug == category.slug, + Product.image_path.like("images/products/%"), + ) + .order_by(Product.best_seller_rank) + .first() + ) + department_images[category.slug] = sample.image_path if sample else None return render_template( "index.html", featured=featured, @@ -808,6 +831,7 @@ def index(): used_highlights=used_highlights, bundles=bundles, categories=categories, + department_images=department_images, spotlight=spotlight, ) diff --git a/sites/bh_photo/asset_inventory.json b/sites/bh_photo/asset_inventory.json new file mode 100644 index 000000000..2db0d0db4 --- /dev/null +++ b/sites/bh_photo/asset_inventory.json @@ -0,0 +1,826 @@ +{ + "7a50f105se": { + "archive_image_url": "https://web.archive.org/web/20260221090207im_/https://www.bhphotovideo.com/images/fb/7artisans_photoelectric_a005b_e_50mm_f_1_05_lens_for_1600715.jpg", + "bytes": 388122, + "file": "images/products/7a50f105se.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/7artisans_photoelectric_a005b_e_50mm_f_1_05_lens_for_1600715.jpg", + "product": "7Artisans 50mm f/1.05 Lens for Sony E", + "sha256": "60a66409be1cc244717562faaa8c9dd5989f2c4f306ee45ea48d0842bab5a2c4" + }, + "7a6f2bm": { + "archive_image_url": "https://web.archive.org/web/20260218075636im_/https://www.bhphotovideo.com/images/fb/7artisans_6f2b_m_manual_fisheye_lens_1934081.jpg", + "bytes": 591384, + "file": "images/products/7a6f2bm.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/7artisans_6f2b_m_manual_fisheye_lens_1934081.jpg", + "product": "7Artisans 6mm f/2 Fisheye Lens (Micro Four Thirds)", + "sha256": "5839c9d9a2ddcddcd43021282674f0ac7056096a72b12361f94637f4a96a95d0" + }, + "7aa114b": { + "archive_image_url": "https://web.archive.org/web/20260220150422im_/https://www.bhphotovideo.com/images/fb/7artisans_photoelectric_a114b_35mm_f_1_4_lens_for_1505992.jpg", + "bytes": 658031, + "file": "images/products/7aa114b.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/7artisans_photoelectric_a114b_35mm_f_1_4_lens_for_1505992.jpg", + "product": "7Artisans 35mm f/1.4 Lens for Sony E", + "sha256": "c0b7ff3afaadf2dca6436182ece6e269725864fe2fe4ba063197a444926d14b2" + }, + "amhhash58": { + "archive_image_url": "https://web.archive.org/web/20260531032010im_/https://www.bhphotovideo.com/images/fb/ambient_recording_hha_sh58_handheld_microphone_adapter_1915440.jpg", + "bytes": 104551, + "file": "images/products/amhhash58.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/ambient_recording_hha_sh58_handheld_microphone_adapter_1915440.jpg", + "product": "Ambient Recording HHA-SH58 Handheld Microphone Adapter for Shure SM58 & Beta 58A Capsule to Sennheiser Handheld", + "sha256": "979d4ea042961411a8270d12407f4cf4ba7aae50bf324f4a6a62b4903e64d749" + }, + "ancfxbcrp": { + "archive_image_url": "https://web.archive.org/web/20260301114307im_/https://www.bhphotovideo.com/images/fb/angelbird_cfxbcrp_performance_cfexpress_type_b_1908749.jpg", + "bytes": 166598, + "file": "images/products/ancfxbcrp.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/angelbird_cfxbcrp_performance_cfexpress_type_b_1908749.jpg", + "product": "Angelbird Performance CFexpress Type B Card Reader", + "sha256": "8718b378d2882a0976c10e6137db20fb5e0b94ad36eb5de85fd2cfd7b3ea9189" + }, + "apmbp14m335p": { + "archive_image_url": "https://web.archive.org/web/20260601054453im_/https://www.bhphotovideo.com/images/fb/apple_14_macbook_pro_and_1804557.jpg", + "bytes": 132231, + "file": "images/products/apmbp14m335p.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/apple_14_macbook_pro_and_1804557.jpg", + "product": "Apple 14\" MacBook Pro and AppleCare+ Protection Plan Kit (M3 Max, Silver)", + "sha256": "75326ae1899af3fe696506b64fcc331f2f5040ebcbc2c6a5c13f2277ee264b76" + }, + "apt12": { + "archive_image_url": "https://web.archive.org/web/20260730151928im_/https://www.bhphotovideo.com/images/fb/api_audio_t12_2_channel_tube_mic_preamp_1904715.jpg", + "bytes": 99136, + "file": "images/products/apt12.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/api_audio_t12_2_channel_tube_mic_preamp_1904715.jpg", + "product": "API AUDIO T12 2-Channel Tube Microphone Preamp", + "sha256": "0acbede112356d284963b67a73ba63cae27230009c1b1129734d641a0b880c4a" + }, + "arsp254775k": { + "archive_image_url": "https://web.archive.org/web/20260312052329im_/https://www.bhphotovideo.com/images/fb/arri_signature_prime_3_lens_set_1901628.jpg", + "bytes": 87243, + "file": "images/products/arsp254775k.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/arri_signature_prime_3_lens_set_1901628.jpg", + "product": "ARRI Signature Prime 3-Lens Set (ARRI LPL)", + "sha256": "83417b8a67db6bf47740fded0c0ed9bc4a934530359a0235174c5afd8fceb557" + }, + "asm1807hab79": { + "archive_image_url": "https://web.archive.org/web/20260708211916im_/https://www.bhphotovideo.com/images/fb/asus_m1807ha_db79_18_vivobook_laptop_ryzen_1907721.jpg", + "bytes": 132224, + "file": "images/products/asm1807hab79.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/asus_m1807ha_db79_18_vivobook_laptop_ryzen_1907721.jpg", + "product": "ASUS 18\" Vivobook M1807HA Laptop", + "sha256": "2d9cac8cfd57b12e2dd2da18a8e0c0502680bc50ceb66bb9335d2498af4532ef" + }, + "atmwoem": { + "archive_image_url": "https://web.archive.org/web/20260218214926im_/https://www.bhphotovideo.com/images/fb/atlas_sound_mwoem_wireless_microphone_over_ear_1500216.jpg", + "bytes": 59269, + "file": "images/products/atmwoem.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/atlas_sound_mwoem_wireless_microphone_over_ear_1500216.jpg", + "product": "AtlasIED Wireless Microphone Over-Ear Unidirectional Condenser Microphone", + "sha256": "c31c3072d5d87764939434b8fea5d6906edf81dad2f7bc3acd17a8c59668bb0a" + }, + "avcomcam550": { + "archive_image_url": "https://web.archive.org/web/20260203112051im_/https://www.bhphotovideo.com/images/fb/aver_comcam550_cam550_4k_dual_lens_ptz_1700139.jpg", + "bytes": 51946, + "file": "images/products/avcomcam550.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/aver_comcam550_cam550_4k_dual_lens_ptz_1700139.jpg", + "product": "AVer CAM550 4K Dual-Lens PTZ Conferencing Camera", + "sha256": "6af5b17be0bbc4e5eeb08b7529783a5bd3cd03f0f573d77c0a582e36677e9620" + }, + "avsmpwilk": { + "archive_image_url": "https://web.archive.org/web/20250906005236im_/https://static.bhphoto.com/images/en/na500x500.jpg", + "bytes": 3763, + "file": "images/products/avsmpwilk.jpg", + "original_image_url": "https://static.bhphoto.com/images/en/na500x500.jpg", + "product": "Avid Studio Monitor Pro with ILok", + "sha256": "4e3b19a088c9b214a0796704f74c4596c0c0180d20a2283e3e2f1ee3016237a1" + }, + "cae90d": { + "archive_image_url": "https://web.archive.org/web/20260208235055im_/https://www.bhphotovideo.com/images/fb/canon_3616c016_eos_90d_dslr_camera_1502488.jpg", + "bytes": 270405, + "file": "images/products/cae90d.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/canon_3616c016_eos_90d_dslr_camera_1502488.jpg", + "product": "Canon EOS 90D DSLR Camera (Body Only)", + "sha256": "e87d7ecddae1c016097319a6f924d9b3787505fe75d23e603fc126935d29915d" + }, + "cae90d18135": { + "archive_image_url": "https://web.archive.org/web/20250419073248im_/https://www.bhphotovideo.com/images/fb/canon_3616c016_eos_90d_dslr_camera_1502489.jpg", + "bytes": 166038, + "file": "images/products/cae90d18135.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/canon_3616c016_eos_90d_dslr_camera_1502489.jpg", + "product": "Canon EOS 90D DSLR Camera with 18-135mm Lens", + "sha256": "b55450730ccf7a7681ccd5a7c462d386290f297445243665bdfba6b35cd17306" + }, + "caec802450k": { + "archive_image_url": "https://web.archive.org/web/20260223050102im_/https://www.bhphotovideo.com/images/fb/canon_eos_c80_cinema_camera_1915619.jpg", + "bytes": 114166, + "file": "images/products/caec802450k.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/canon_eos_c80_cinema_camera_1915619.jpg", + "product": "Canon EOS C80 Cinema Camera Kit with 24 & 50mm f/1.4 L VCM Lenses (Canon RF)", + "sha256": "1dc311aaedf234cfff143643d29292ef6dc9096230eb63ce9bde5a5e812058f9" + }, + "caer1001845k": { + "archive_image_url": "https://web.archive.org/web/20260213102945im_/https://www.bhphotovideo.com/images/fb/canon_eos_r100_mirrorless_camera_1912148.jpg", + "bytes": 72747, + "file": "images/products/caer1001845k.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/canon_eos_r100_mirrorless_camera_1912148.jpg", + "product": "Canon EOS R100 Mirrorless Camera with 18-45mm and 50mm Lenses Kit", + "sha256": "46710628e1422feedc97de49d30a8b8b3bdf53df5d073b2aef9c3aed57580aab" + }, + "caes73b": { + "archive_image_url": "https://web.archive.org/web/20251230174350im_/https://www.bhphotovideo.com/images/fb/canon_7293c001_lens_hood_es_73b_1930514.jpg", + "bytes": 188258, + "file": "images/products/caes73b.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/canon_7293c001_lens_hood_es_73b_1930514.jpg", + "product": "Canon ES-73B Lens Hood", + "sha256": "39bda19b0f5e71c148e7ad8407b61257545fda9c7571794b139e0abd226fbba1" + }, + "cahg100tbr": { + "archive_image_url": "https://web.archive.org/web/20260222155554im_/https://www.bhphotovideo.com/images/fb/canon_4157c001_hg_100tbr_tripod_grip_1512527.jpg", + "bytes": 58929, + "file": "images/products/cahg100tbr.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/canon_4157c001_hg_100tbr_tripod_grip_1512527.jpg", + "product": "Canon HG-100TBR Tripod Grip", + "sha256": "a7f22cd60a4837f1678d33b6a8912a40f633ec3952e34779e3d0f48015d109c4" + }, + "cocmefeosr": { + "archive_image_url": "https://web.archive.org/web/20260220063139im_/https://www.bhphotovideo.com/images/fb/commlite_cm_ef_eos_r_electronic_af_lens_mount_1503268.jpg", + "bytes": 107740, + "file": "images/products/cocmefeosr.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/commlite_cm_ef_eos_r_electronic_af_lens_mount_1503268.jpg", + "product": "Commlite Electronic Autofocus Lens Mount Adapter for Canon EF or EF-S-Mount Lens to Canon RF-Mount Camera", + "sha256": "bcc888312512d5851f12517cf67fbf80c2d8294c3cc215cf02000519c915a532" + }, + "dedmpwv91t": { + "archive_image_url": "https://web.archive.org/web/20260214132544im_/https://www.bhphotovideo.com/images/fb/delkin_devices_dmpwv91t_p_1tb_power_uhs_ii_microsdxc_1926844.jpg", + "bytes": 88929, + "file": "images/products/dedmpwv91t.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/delkin_devices_dmpwv91t_p_1tb_power_uhs_ii_microsdxc_1926844.jpg", + "product": "Delkin Devices 1TB POWER UHS-II microSDXC Memory Card with SD Adapter", + "sha256": "7d2753506e3e827ffa87d7ffeff53d4825d36cac245112e7917069c355082e0a" + }, + "dedtt0272d80": { + "archive_image_url": "https://web.archive.org/web/20251130234320im_/https://www.bhphotovideo.com/images/fb/deity_microphones_dtt0272d80_tc_1_1705805.jpg", + "bytes": 121830, + "file": "images/products/dedtt0272d80.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/deity_microphones_dtt0272d80_tc_1_1705805.jpg", + "product": "Deity Microphones TC-1 Wireless Timecode Generator Box (Bluetooth, 2.4 GHz)", + "sha256": "2dae1b529e54fd3ed321af28b9c8f42655b55d07912d012391a44ba920047899" + }, + "djm5pfmcprc2": { + "archive_image_url": "https://web.archive.org/web/20251229161557im_/https://www.bhphotovideo.com/images/fb/dji_cp_ma_00000895_01_mini_5_pro_drone_1916806.jpg", + "bytes": 103808, + "file": "images/products/djm5pfmcprc2.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/dji_cp_ma_00000895_01_mini_5_pro_drone_1916806.jpg", + "product": "DJI Mini 5 Pro Drone with RC2 Fly More Combo Plus", + "sha256": "8e0f3368f4b34f814b5dd3f1274734775a1aabbadae9653ac803f1ecc3878c1f" + }, + "dz100vpl": { + "archive_image_url": "https://web.archive.org/web/20260109005323im_/https://www.bhphotovideo.com/images/fb/dzofilm_vespid_100mm_t2_1_lens_1601847.jpg", + "bytes": 580118, + "file": "images/products/dz100vpl.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/dzofilm_vespid_100mm_t2_1_lens_1601847.jpg", + "product": "DZOFilm VESPID 100mm T2.1 Lens (PL & EF Mounts)", + "sha256": "774bceaa94ac04567340290b0f1fdb77f0106302d48d09c70cd00ab8763ee42f" + }, + "dz125vpl": { + "archive_image_url": "https://web.archive.org/web/20260110095944im_/https://www.bhphotovideo.com/images/fb/dzofilm_vespid_125mm_t2_1_lens_1601848.jpg", + "bytes": 488166, + "file": "images/products/dz125vpl.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/dzofilm_vespid_125mm_t2_1_lens_1601848.jpg", + "product": "DZOFilm VESPID 125mm T2.1 Lens (PL & EF Mounts)", + "sha256": "9a10b1a62a3cba03fef4a392326b18677309d9db85e3521c096d58f23937218e" + }, + "epds770ii": { + "archive_image_url": "https://web.archive.org/web/20250825134145im_/https://www.bhphotovideo.com/images/fb/epson_b11b262201_ds_770_ii_document_scanner_1601979.jpg", + "bytes": 377286, + "file": "images/products/epds770ii.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/epson_b11b262201_ds_770_ii_document_scanner_1601979.jpg", + "product": "Epson DS-770 II Color Duplex Document Scanner", + "sha256": "9f820ab0b818d6a22cebb599e9d44c911228ecd658dde809efb87f6d7e7f522b" + }, + "fibpk102cf": { + "archive_image_url": "https://web.archive.org/web/20260212084502im_/https://www.bhphotovideo.com/images/fb/film_devices_bpk_102_cf_microphone_travel_boom_pole_1606651.jpg", + "bytes": 114457, + "file": "images/products/fibpk102cf.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/film_devices_bpk_102_cf_microphone_travel_boom_pole_1606651.jpg", + "product": "Film Devices Microphone Travel Boompole Kit (Carbon Fiber)", + "sha256": "7786f4e3c444d1e219fe767cf1475ea594a52e7b9103b146c4e8b8ee6d93bb72" + }, + "fig6cleko10": { + "archive_image_url": "https://web.archive.org/web/20260204224901im_/https://www.bhphotovideo.com/images/fb/fiilex_flxg6clr_leko10_leko_lens_tube_for_1924247.jpg", + "bytes": 58785, + "file": "images/products/fig6cleko10.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/fiilex_flxg6clr_leko10_leko_lens_tube_for_1924247.jpg", + "product": "Fiilex Leko Lens Tube for G6 Color (10\u00b0)", + "sha256": "90e92ce5e549d9eab4ca6efbd81a2d3f1939454b27ccf0ef6a3efad1fa190c75" + }, + "fig6cleko26": { + "archive_image_url": "https://web.archive.org/web/20260311045624im_/https://www.bhphotovideo.com/images/fb/fiilex_flxg6clr_leko26_leko_lens_tube_for_1924249.jpg", + "bytes": 63611, + "file": "images/products/fig6cleko26.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/fiilex_flxg6clr_leko26_leko_lens_tube_for_1924249.jpg", + "product": "Fiilex Leko Lens Tube for G6 Color (26\u00b0)", + "sha256": "783c0307c715c67d467691409b8ed07df3cfb3e254713453e8a208ec8e1f5ac7" + }, + "fip3clrf1545": { + "archive_image_url": "https://web.archive.org/web/20260224053552im_/https://www.bhphotovideo.com/images/fb/fiilex_flxp3clr_frnl1545_fresnel_lens_for_p3_1924254.jpg", + "bytes": 176530, + "file": "images/products/fip3clrf1545.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/fiilex_flxp3clr_frnl1545_fresnel_lens_for_p3_1924254.jpg", + "product": "Fiilex Fresnel Lens for P3 Color (15-45\u00b0)", + "sha256": "3f0227fb2049c7c01590c96faf85ddf52547fd8c07289f29d6c44efb01ed59e8" + }, + "fiq5clrocta3": { + "archive_image_url": "https://web.archive.org/web/20260305034324im_/https://www.bhphotovideo.com/images/fb/fiilex_flxq5clr_octa3_octa_3_softbox_for_1924266.jpg", + "bytes": 46772, + "file": "images/products/fiq5clrocta3.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/fiilex_flxq5clr_octa3_octa_3_softbox_for_1924266.jpg", + "product": "Fiilex Octa 3 Softbox for Q5 Color Series", + "sha256": "de1dbbd861e55dfc4f8331166a1553d4bf6cdd4846b4a309bca679c2d445ab3b" + }, + "focbaxcdpls": { + "archive_image_url": "https://web.archive.org/web/20251129074714im_/https://www.bhphotovideo.com/images/fb/fotodiox_cba_xcd_pls_lens_adapter_plus_for_1902491.jpg", + "bytes": 126241, + "file": "images/products/focbaxcdpls.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/fotodiox_cba_xcd_pls_lens_adapter_plus_for_1902491.jpg", + "product": "FotodioX Lens Adapter Plus (Contax RF to Hasselblad X)", + "sha256": "be580431ff4e06d4e6efa88b2dc45c1cef0192068c6dd50d01b289781c5dfa88" + }, + "frfdhssca102": { + "archive_image_url": "https://web.archive.org/web/20260203034711im_/https://www.bhphotovideo.com/images/fb/fractal_design_fd_hs_sca1_02_scape_light_wireless_rgb_1901248.jpg", + "bytes": 245049, + "file": "images/products/frfdhssca102.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/fractal_design_fd_hs_sca1_02_scape_light_wireless_rgb_1901248.jpg", + "product": "Fractal Design Scape Light Wireless RGB Gaming Headset (Gray)", + "sha256": "ed10082bc19b35e33bd5c207161cac2a9ac4fa0f03e840d98ef655da710f24c3" + }, + "fuix500r2": { + "archive_image_url": "https://web.archive.org/web/20250804174547im_/https://www.bhphotovideo.com/images/fb/fujitsu_pa03656_b305_r_scansnap_ix500_document_scanner_1607485.jpg", + "bytes": 63893, + "file": "images/products/fuix500r2.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/fujitsu_pa03656_b305_r_scansnap_ix500_document_scanner_1607485.jpg", + "product": "Ricoh ScanSnap iX500 Wireless Desktop Scanner (Refurbished by Manufacturer)", + "sha256": "48093d49b83d5b9bb7df5230fe6c79a5f0f4f2ef6932487d5ffd303fedf9b0ec" + }, + "fuxa7s": { + "archive_image_url": "https://web.archive.org/web/20260216151029im_/https://www.bhphotovideo.com/images/fb/fujifilm_16638110_x_a7_mirrorless_digital_camera_1505363.jpg", + "bytes": 489712, + "file": "images/products/fuxa7s.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/fujifilm_16638110_x_a7_mirrorless_digital_camera_1505363.jpg", + "product": "FUJIFILM X-A7 Mirrorless Digital Camera with 15-45mm Lens (Silver)", + "sha256": "f3d21e1ce9fd555f10604e7dbec37f5a9d4f585a54cab10bbe744c97aa841068" + }, + "fuxt303cb": { + "archive_image_url": "https://web.archive.org/web/20251207182857im_/https://www.bhphotovideo.com/images/fb/fujifilm_16957841_x_t30_iii_mirrorless_camera_1926406.jpg", + "bytes": 477839, + "file": "images/products/fuxt303cb.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/fujifilm_16957841_x_t30_iii_mirrorless_camera_1926406.jpg", + "product": "FUJIFILM X-T30 III Mirrorless Camera (Black)", + "sha256": "c2edda818932fd8644371f98ac5c46d699db3e7073ba4ddbc00aff1e915e83f1" + }, + "fuxt303ckb": { + "archive_image_url": "https://web.archive.org/web/20251114173132im_/https://www.bhphotovideo.com/images/fb/fujifilm_16966880_x_t30_iii_mirrorless_camera_1926409.jpg", + "bytes": 496239, + "file": "images/products/fuxt303ckb.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/fujifilm_16966880_x_t30_iii_mirrorless_camera_1926409.jpg", + "product": "FUJIFILM X-T30 III Mirrorless Camera with 13-33mm f/3.5-6.3 Lens (Black)", + "sha256": "e756b066ab2932de3c433aef28efe50e9b665c6afdf0206c331394f4a6f253c5" + }, + "fuxt303cks": { + "archive_image_url": "https://web.archive.org/web/20260718214144im_/https://www.bhphotovideo.com/images/fb/fujifilm_16966969_x_t30_iii_mirrorless_camera_1926411.jpg", + "bytes": 490304, + "file": "images/products/fuxt303cks.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/fujifilm_16966969_x_t30_iii_mirrorless_camera_1926411.jpg", + "product": "FUJIFILM X-T30 III Mirrorless Camera with 13-33mm f/3.5-6.3 Lens (Silver)", + "sha256": "94a859e96835546a307729785549215a1435e8f42a2d5fd32da9258831141b55" + }, + "hohsct": { + "archive_image_url": "https://web.archive.org/web/20251016193230im_/https://www.bhphotovideo.com/images/fb/hoodman_hsct_tripod_mount_for_dji_1512569.jpg", + "bytes": 55825, + "file": "images/products/hohsct.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/hoodman_hsct_tripod_mount_for_dji_1512569.jpg", + "product": "Hoodman Tripod Mount for DJI Smart Controller", + "sha256": "bb7efeac6aedbec9462f7b459d2b792225792249debbfac96cc3dc1b8d9fe491" + }, + "incinsabwb": { + "archive_image_url": "https://web.archive.org/web/20251031001632im_/https://www.bhphotovideo.com/images/fb/insta360_cinsabwb_mic_air_transmitter_1903881.jpg", + "bytes": 497767, + "file": "images/products/incinsabwb.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/insta360_cinsabwb_mic_air_transmitter_1903881.jpg", + "product": "Insta360 Mic Air Wireless Transmitter (2.4 GHz)", + "sha256": "dd8c563c717c2f665356737b9938cca319cadd7c7eb44f0d22ffe5e997967dc7" + }, + "inpmm": { + "archive_image_url": "https://web.archive.org/web/20250130044315im_/https://www.bhphotovideo.com/images/fb/inovativ_501_600_pro_monitor_mount_1507333.jpg", + "bytes": 98466, + "file": "images/products/inpmm.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/inovativ_501_600_pro_monitor_mount_1507333.jpg", + "product": "Inovativ Pro Monitor Mount", + "sha256": "5fbcf674bfc120188b5235cb6f173a93d7c270defae3fb71203dd814d33dec17" + }, + "irilc11li": { + "archive_image_url": "https://web.archive.org/web/20251211235007im_/https://www.bhphotovideo.com/images/fb/irix_il_c11_l_i_11mm_t4_3_cine_lens_1602105.jpg", + "bytes": 359584, + "file": "images/products/irilc11li.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/irix_il_c11_l_i_11mm_t4_3_cine_lens_1602105.jpg", + "product": "IRIX 11mm T4.3 Cine Lens (L-Mount, Feet, Black)", + "sha256": "4fcd112a8843faa884bd082c91f70086cb5238389c24628d93858ee9ea813c96" + }, + "irilc11zi": { + "archive_image_url": "https://web.archive.org/web/20251210205651im_/https://www.bhphotovideo.com/images/fb/irix_il_c11_z_i_11mm_t4_3_cine_lens_1602108.jpg", + "bytes": 359584, + "file": "images/products/irilc11zi.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/irix_il_c11_z_i_11mm_t4_3_cine_lens_1602108.jpg", + "product": "IRIX 11mm T4.3 Cine Lens (Z-Mount, Feet, Black)", + "sha256": "4fcd112a8843faa884bd082c91f70086cb5238389c24628d93858ee9ea813c96" + }, + "ishmm": { + "archive_image_url": "https://web.archive.org/web/20260222180039im_/https://www.bhphotovideo.com/images/fb/isovox_horizontal_mic_mount_1705753.jpg", + "bytes": 54028, + "file": "images/products/ishmm.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/isovox_horizontal_mic_mount_1705753.jpg", + "product": "ISOVOX Horizontal Mic Mount for Vocal Isolation Booth", + "sha256": "6662493e97e45b4508393be890eaa4a32974f9d121cadf803b39b95df4653d04" + }, + "le21ql0017us": { + "archive_image_url": "https://web.archive.org/web/20260708213955im_/https://www.bhphotovideo.com/images/fb/lenovo_21ql0017us_14_thinkpad_p14s_gen_1908728.jpg", + "bytes": 245122, + "file": "images/products/le21ql0017us.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/lenovo_21ql0017us_14_thinkpad_p14s_gen_1908728.jpg", + "product": "Lenovo 14\" ThinkPad P14s Gen 6 Laptop", + "sha256": "57d0d5c179c3d7561f919902bec26822c3ed91c5e53b3d378589c01e662b0757" + }, + "le21qt0036us": { + "archive_image_url": "https://web.archive.org/web/20260708211908im_/https://www.bhphotovideo.com/images/fb/lenovo_21qt0036us_14_5_thinkpad_p14s_gen_1923611.jpg", + "bytes": 115427, + "file": "images/products/le21qt0036us.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/lenovo_21qt0036us_14_5_thinkpad_p14s_gen_1923611.jpg", + "product": "Lenovo 14.5\" ThinkPad P14s Gen 6 Laptop", + "sha256": "aab525d2ee8a87183cd6061bf82eb7b27588a45b978951e9bd9dbd6dab9ca2a4" + }, + "le21td000vus": { + "archive_image_url": "https://web.archive.org/web/20260708182155im_/https://www.bhphotovideo.com/images/fb/lenovo_21td000vus_16_thinkpad_t1g_g8_1922655.jpg", + "bytes": 265055, + "file": "images/products/le21td000vus.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/lenovo_21td000vus_16_thinkpad_t1g_g8_1922655.jpg", + "product": "Lenovo 16\" ThinkPad T1g Gen 8 Multi-Touch Laptop", + "sha256": "82efbdffd46aaac30225855832ca114d7db54c92399f564ff93e3ac7b0f32ac0" + }, + "le256cftacg": { + "archive_image_url": "https://web.archive.org/web/20260715222710im_/https://www.bhphotovideo.com/images/fb/lexar_lcaexg4256g_rneng_256gb_professional_gold_cfexpress_1930696.jpg", + "bytes": 454539, + "file": "images/products/le256cftacg.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/lexar_lcaexg4256g_rneng_256gb_professional_gold_cfexpress_1930696.jpg", + "product": "Lexar 256GB Professional GOLD CFexpress 4.0 Type A Memory Card", + "sha256": "6f44e230a98bc67562da8b1d5b9a04dbb1f45ee39fdaf8bcfbd818f12d4a636f" + }, + "le512cftacg": { + "archive_image_url": "https://web.archive.org/web/20260707150002im_/https://www.bhphotovideo.com/images/fb/lexar_lcaexg4512g_rneng_512gb_professional_gold_cfexpress_1930697.jpg", + "bytes": 453089, + "file": "images/products/le512cftacg.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/lexar_lcaexg4512g_rneng_512gb_professional_gold_cfexpress_1930697.jpg", + "product": "Lexar 512GB Professional GOLD CFexpress 4.0 Type A Memory Card", + "sha256": "8bf5ddd2e667d81d17e3845b38fd3b1cce2a4a6fbab2e3eb198e8af03e0cf8ce" + }, + "lees5mpssd2t": { + "archive_image_url": "https://web.archive.org/web/20260514222256im_/https://www.bhphotovideo.com/images/fb/lexar_lsl500x002t_rnbnu_es5_magnetic_portable_ssd_1928930.jpg", + "bytes": 466373, + "file": "images/products/lees5mpssd2t.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/lexar_lsl500x002t_rnbnu_es5_magnetic_portable_ssd_1928930.jpg", + "product": "Lexar 2TB SL500 USB 3.2 Gen 2x2 Portable SSD", + "sha256": "b79f192fd997290a3b4ab13b9950fbec661059e4a49aba70412977fa2b1ddeeb" + }, + "memkrfaf1": { + "archive_image_url": "https://web.archive.org/web/20260208090734im_/https://www.bhphotovideo.com/images/fb/meike_mk_rf_af1_for_canon_mirrorless_1502602.jpg", + "bytes": 521860, + "file": "images/products/memkrfaf1.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/meike_mk_rf_af1_for_canon_mirrorless_1502602.jpg", + "product": "Meike MK-RF-AF1 13mm and 18mm Extension Tubes for Canon RF", + "sha256": "c7f4c7fc06512ad3f3e4e2b798aac01da9857ef7d156126a04ad43b604dce5ff" + }, + "modilmi12p": { + "archive_image_url": "https://web.archive.org/web/20260711121800im_/https://www.bhphotovideo.com/images/fb/moment_310_137_drop_in_lens_mount_for_1601649.jpg", + "bytes": 132187, + "file": "images/products/modilmi12p.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/moment_310_137_drop_in_lens_mount_for_1601649.jpg", + "product": "Moment Drop-In Lens Mount for the iPhone 12 Pro", + "sha256": "46c6428767d8eedcdd536d27ffd04a4af2ce5c5e77969c65c1fec211c09a5a8d" + }, + "ni604": { + "archive_image_url": "https://web.archive.org/web/20251201173432im_/https://www.bhphotovideo.com/images/fb/niceyrig_604_video_tripod_mount_side_1926091.jpg", + "bytes": 214632, + "file": "images/products/ni604.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/niceyrig_604_video_tripod_mount_side_1926091.jpg", + "product": "Niceyrig Video Tripod Mount Side Plate with Standard ARRI Rosette Mount", + "sha256": "663f557ccf4e061e26d3ca036b970dcaeeb7183a973b55d5577947cd30918c87" + }, + "nihb117": { + "archive_image_url": "https://web.archive.org/web/20251213032721im_/https://www.bhphotovideo.com/images/fb/nikon_4295_hb_117_lens_hood_1916257.jpg", + "bytes": 537947, + "file": "images/products/nihb117.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/nikon_4295_hb_117_lens_hood_1916257.jpg", + "product": "Nikon HB-117 Lens Hood", + "sha256": "abcd2446872de877cb75b3cd4ede66362e04cca5c9cc31828d440faad91401c6" + }, + "niz522450ak": { + "archive_image_url": "https://web.archive.org/web/20260121132358im_/https://www.bhphotovideo.com/images/fb/nikon_z5_ii_mirrorless_camera_1931819.jpg", + "bytes": 127898, + "file": "images/products/niz522450ak.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/nikon_z5_ii_mirrorless_camera_1931819.jpg", + "product": "Nikon Z5 II Mirrorless Camera with 24-50mm f/4-6.3 Lens and Basic Bundle", + "sha256": "9b996915f687e6f47d668ac421d510c2c178af36301d9155b85a367a046753af" + }, + "niz52ak": { + "archive_image_url": "https://web.archive.org/web/20260125121011im_/https://www.bhphotovideo.com/images/fb/nikon_z5_ii_mirrorless_camera_1931818.jpg", + "bytes": 131385, + "file": "images/products/niz52ak.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/nikon_z5_ii_mirrorless_camera_1931818.jpg", + "product": "Nikon Z5 II Mirrorless Camera with Basic Bundle", + "sha256": "04f9a0f7a5552b8f3f43950b2878571b23ceaaee023cd78383b7062c78722c01" + }, + "nizfs2470k": { + "archive_image_url": "https://web.archive.org/web/20251116130233im_/https://www.bhphotovideo.com/images/fb/nikon_2016_zf_mirrorless_camera_with_1918832.jpg", + "bytes": 817983, + "file": "images/products/nizfs2470k.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/nikon_2016_zf_mirrorless_camera_with_1918832.jpg", + "product": "Nikon Zf Mirrorless Camera with 24-70mm f/4 Lens (Silver)", + "sha256": "93475e6ab617face86b71407c51fd31cde0c547b7586dac3eeafddbdbe793a20" + }, + "nizr2450": { + "archive_image_url": "https://web.archive.org/web/20251002090448im_/https://www.bhphotovideo.com/images/fb/nikon_2043_zr_cinema_camera_with_1920127.jpg", + "bytes": 663201, + "file": "images/products/nizr2450.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/nikon_2043_zr_cinema_camera_with_1920127.jpg", + "product": "Nikon ZR Cinema Camera with 24-50mm f/4-6.3 Lens Kit", + "sha256": "e0dae1f2298be6c7c0f1fc757c2c22f1c4a91321e774f7c8fe8715215714e954" + }, + "nizr35": { + "archive_image_url": "https://web.archive.org/web/20260107215728im_/https://www.bhphotovideo.com/images/fb/nikon_2042_zr_cinema_camera_with_1920128.jpg", + "bytes": 608505, + "file": "images/products/nizr35.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/nikon_2042_zr_cinema_camera_with_1920128.jpg", + "product": "Nikon ZR Cinema Camera with 35mm f/1.4 Lens Kit", + "sha256": "74931d8978117df01a8def2576615bef37ed6874c2ba393ef55508001c7f8ceb" + }, + "obgh30c": { + "archive_image_url": "https://web.archive.org/web/20260710211006im_/https://www.bhphotovideo.com/images/fb/oben_gh_30c_carbon_fiber_gimbal_1500226.jpg", + "bytes": 371379, + "file": "images/products/obgh30c.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/oben_gh_30c_carbon_fiber_gimbal_1500226.jpg", + "product": "Oben GH-30C Carbon Fiber Gimbal Head", + "sha256": "60fca0956390849e51eef66122dd1743de66c8f4e522d8fed97f02cc4f01608d" + }, + "padcg97mkq": { + "archive_image_url": "https://web.archive.org/web/20260610120903im_/https://www.bhphotovideo.com/images/fb/panasonic_dc_g97mk9_panasonic_lumix_g97_mirrorless_1936326.jpg", + "bytes": 462073, + "file": "images/products/padcg97mkq.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/panasonic_dc_g97mk9_panasonic_lumix_g97_mirrorless_1936326.jpg", + "product": "Panasonic LUMIX G97 Mirrorless Camera with 12-60mm f/3.5-5.6 Lens", + "sha256": "c536b9a28da038d89f9c79801f96b05a51c47c4c2064edd3df253e1b765ac66f" + }, + "padcs92820sk": { + "archive_image_url": "https://web.archive.org/web/20251124180908im_/https://www.bhphotovideo.com/images/fb/panasonic_panasonic_lumix_s9_mirrorless_1926930.jpg", + "bytes": 153269, + "file": "images/products/padcs92820sk.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/panasonic_panasonic_lumix_s9_mirrorless_1926930.jpg", + "product": "Panasonic Lumix S9 Mirrorless Camera with 28-200mm f/4-7.1 Lens and Street-Travel Photography Kit (Jet Black)", + "sha256": "55753cd1127a1ce7e6618b7b3a15649485263a607e5962a139b3b8e5fc481312" + }, + "pekfb1855lkq": { + "archive_image_url": "https://web.archive.org/web/20250419081907im_/https://www.bhphotovideo.com/images/fb/pentax_pentax_kf_dslr_camera_1803239.jpg", + "bytes": 92372, + "file": "images/products/pekfb1855lkq.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/pentax_pentax_kf_dslr_camera_1803239.jpg", + "product": "Pentax KF DSLR Camera with 18-55mm and 55-300mm Lenses Kit", + "sha256": "ea1e191505e21530c2ea8eb1315eeed5644eddeb9077835eca158f8f19f24def" + }, + "pr1tgbgv90c": { + "archive_image_url": "https://web.archive.org/web/20260219032319im_/https://www.bhphotovideo.com/images/fb/prograde_digital_pgsd1tbkbh_1tb_uhs_ii_sdxc_gold_1916038.jpg", + "bytes": 74100, + "file": "images/products/pr1tgbgv90c.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/prograde_digital_pgsd1tbkbh_1tb_uhs_ii_sdxc_gold_1916038.jpg", + "product": "ProGrade Digital 1TB Gold UHS-II SDXC Memory Card", + "sha256": "ca1f48536e3116d862ff65f58176f5fa721284901db24bbd0b777453afbda5d0" + }, + "rapro33dp": { + "archive_image_url": "https://web.archive.org/web/20250826205734im_/https://www.bhphotovideo.com/images/fb/raise_3d_1_01_024_001a01_pro3_3d_printer_1908326.jpg", + "bytes": 588305, + "file": "images/products/rapro33dp.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/raise_3d_1_01_024_001a01_pro3_3d_printer_1908326.jpg", + "product": "Raise 3D Pro3 3D Printer", + "sha256": "0ed8324f0779cdf6fd180ee039240ab2d61f4d3dbdf3a7a39722d16ef8ce1375" + }, + "ropodmicak": { + "archive_image_url": "https://web.archive.org/web/20260507104705im_/https://www.bhphotovideo.com/images/fb/rode_podmic_dynamic_podcasting_microphone_1930254.jpg", + "bytes": 71115, + "file": "images/products/ropodmicak.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/rode_podmic_dynamic_podcasting_microphone_1930254.jpg", + "product": "RODE PodMic Dynamic Podcasting Microphone Kit with Desktop Studio Arm, Pop Filter & Cable (Black)", + "sha256": "a7550845258cde27bf1c8d9c54a2b4d3147a2b2b1cda70bbd690a1300240b25f" + }, + "ropodmicpak": { + "archive_image_url": "https://web.archive.org/web/20260507104724im_/https://www.bhphotovideo.com/images/fb/rode_podmic_microphone_with_boom_1930253.jpg", + "bytes": 71536, + "file": "images/products/ropodmicpak.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/rode_podmic_microphone_with_boom_1930253.jpg", + "product": "RODE PodMic Microphone with Boom Arm, Pop Filter & Cable", + "sha256": "d2bad8fb149070feeab4f93a4ab98e3f31a1b8ddfc1ee74965428afa6dc5debe" + }, + "sacfep512k10": { + "archive_image_url": "https://web.archive.org/web/20260212031443im_/https://www.bhphotovideo.com/images/fb/sandisk_512gb_extreme_pro_cfexpress_1911631.jpg", + "bytes": 73540, + "file": "images/products/sacfep512k10.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sandisk_512gb_extreme_pro_cfexpress_1911631.jpg", + "product": "SanDisk 512GB Extreme PRO CFexpress Type B Memory Card with 64GB Extreme PRO UHS-II SDXC Memory Card", + "sha256": "eaad3c4c41ba9eb0cbcd6b83b95cdac5052cb539f139a71fcd66b96b57ec1a83" + }, + "sacfep512k11": { + "archive_image_url": "https://web.archive.org/web/20260128144428im_/https://www.bhphotovideo.com/images/fb/sandisk_512gb_extreme_pro_cfexpress_1911648.jpg", + "bytes": 73926, + "file": "images/products/sacfep512k11.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sandisk_512gb_extreme_pro_cfexpress_1911648.jpg", + "product": "SanDisk 512GB Extreme PRO CFexpress Type B Memory Card with 128GB Extreme PRO UHS-II SDXC Memory Card", + "sha256": "a2c0b40177f2a952e0943742945e6398499c4ba7018124e0decb8a97513056cc" + }, + "saq2uphgk": { + "archive_image_url": "https://web.archive.org/web/20260507092344im_/https://www.bhphotovideo.com/images/fb/samson_q2u_dynamic_usb_xlr_microphone_1701649.jpg", + "bytes": 45834, + "file": "images/products/saq2uphgk.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/samson_q2u_dynamic_usb_xlr_microphone_1701649.jpg", + "product": "Samson Q2U Dynamic USB/XLR Microphone Recording and Podcasting Kit with Headphones (Gray Mic)", + "sha256": "a82a7ddd1baad20c51feeaefef7227d1f1dec02e1768fa19651d7ef1ba52a609" + }, + "sasqao2566zk": { + "archive_image_url": "https://web.archive.org/web/20260213075003im_/https://www.bhphotovideo.com/images/fb/sandisk_sdsqxao_256g_gn6zk_256gb_pokemon_microsd_card_1936053.jpg", + "bytes": 304535, + "file": "images/products/sasqao2566zk.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sandisk_sdsqxao_256g_gn6zk_256gb_pokemon_microsd_card_1936053.jpg", + "product": "SanDisk 256GB Pokemon UHS-I microSDXC Memory Card", + "sha256": "73a0c62370a1c08ecb62e93164fdb285145b3a8d8b48b2299464588da4dc72f1" + }, + "sassd2tg28": { + "archive_image_url": "https://web.archive.org/web/20260718045432im_/https://www.bhphotovideo.com/images/fb/sandisk_sdssda_2t00_g28_2tb_ssd_plus_internal_1917037.jpg", + "bytes": 60351, + "file": "images/products/sassd2tg28.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sandisk_sdssda_2t00_g28_2tb_ssd_plus_internal_1917037.jpg", + "product": "SanDisk 2TB SSD Plus SATA III 2.5\" Internal SSD", + "sha256": "a10f927f6a4f4a93856452a04acfb9a0eec79dcbeeb0872e26d34feb9a7e808a" + }, + "seie600": { + "archive_image_url": "https://web.archive.org/web/20250219162002im_/https://www.bhphotovideo.com/images/fb/sennheiser_508948_ie_600_in_ear_headphones_1704075.jpg", + "bytes": 54701, + "file": "images/products/seie600.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sennheiser_508948_ie_600_in_ear_headphones_1704075.jpg", + "product": "Sennheiser IE 600 In-Ear Headphones", + "sha256": "64242d6b11266a1c58f9615c6f71c58579ddcd83ca7e231f7ea20e1579503e19" + }, + "si214x01": { + "archive_image_url": "https://web.archive.org/web/20251219205706im_/https://www.bhphotovideo.com/images/fb/sigma_214x01_lp_214a_lens_pouch_1908060.jpg", + "bytes": 1081817, + "file": "images/products/si214x01.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sigma_214x01_lp_214a_lens_pouch_1908060.jpg", + "product": "Sigma Soft Lens Pouch for 17-40mm f/1.8 DC Art", + "sha256": "a8799cbb71cdbf63fc74e831c0ee7879a0f9e10c5b2edd599118ff4c21f18021" + }, + "silh112601": { + "archive_image_url": "https://web.archive.org/web/20251212031339im_/https://www.bhphotovideo.com/images/fb/sigma_lh1126_01_lens_hood_for_135mm_1917704.jpg", + "bytes": 557419, + "file": "images/products/silh112601.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sigma_lh1126_01_lens_hood_for_135mm_1917704.jpg", + "product": "Sigma Lens Hood for 135mm f/1.4 Art DG Lens", + "sha256": "ac626023deb2fde99160e2d974fae03b92d52484458cecb56fe95ed30d28b8cf" + }, + "silh72802": { + "archive_image_url": "https://web.archive.org/web/20251219122557im_/https://www.bhphotovideo.com/images/fb/sigma_lh728_02_lens_hood_for_17_40mm_1908065.jpg", + "bytes": 415541, + "file": "images/products/silh72802.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sigma_lh728_02_lens_hood_for_17_40mm_1908065.jpg", + "product": "Sigma Lens Hood for 17-40mm f/1.8 Art DC Lens", + "sha256": "0870ef5f56dae2c64c46df7994fc2f0d98e246e797c240e6d45f0797b3ec2f1d" + }, + "sits181": { + "archive_image_url": "https://web.archive.org/web/20251214215402im_/https://www.bhphotovideo.com/images/fb/sigma_ts_181_tripod_socket_1917716.jpg", + "bytes": 386203, + "file": "images/products/sits181.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sigma_ts_181_tripod_socket_1917716.jpg", + "product": "Sigma TS-181 Tripod Socket", + "sha256": "88dcf5bdc320d49bc0b961c1baeb185e01952db13a9723b1d79ef08f2639fa3b" + }, + "skx2": { + "archive_image_url": "https://web.archive.org/web/20250810221042im_/https://static.bhphoto.com/images/en/na500x500.jpg", + "bytes": 3763, + "file": "images/products/skx2.jpg", + "original_image_url": "https://static.bhphoto.com/images/en/na500x500.jpg", + "product": "SKYROVER X1 Drone", + "sha256": "4e3b19a088c9b214a0796704f74c4596c0c0180d20a2283e3e2f1ee3016237a1" + }, + "soa6700165bk": { + "archive_image_url": "https://web.archive.org/web/20251204225615im_/https://www.bhphotovideo.com/images/fb/sony_a6700_mirrorless_camera_with_1928284.jpg", + "bytes": 174681, + "file": "images/products/soa6700165bk.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sony_a6700_mirrorless_camera_with_1928284.jpg", + "product": "Sony a6700 Mirrorless Camera with 16-50mm f/3.5-5.6 II Lens and Basic Bundle", + "sha256": "34280c717239d6aeafd311578b4ea02b358dc0101707a9cf61d59536abf225fc" + }, + "soa6700165cc": { + "archive_image_url": "https://web.archive.org/web/20251204060753im_/https://www.bhphotovideo.com/images/fb/sony_a6700_mirrorless_camera_with_1928285.jpg", + "bytes": 160211, + "file": "images/products/soa6700165cc.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sony_a6700_mirrorless_camera_with_1928285.jpg", + "product": "Sony a6700 Mirrorless Camera with 16-50mm f/3.5-5.6 II Lens and Content Creation Kit", + "sha256": "08cdb9048fec54f22da065b9ba14445d10be01c1d8fc9ef9c37f756860c6a2d9" + }, + "soa75": { + "archive_image_url": "https://web.archive.org/web/20251204184200im_/https://www.bhphotovideo.com/images/fb/sony_a7_v_mirrorless_camera_1935439.jpg", + "bytes": 655297, + "file": "images/products/soa75.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sony_a7_v_mirrorless_camera_1935439.jpg", + "product": "Sony a7 V Mirrorless Camera", + "sha256": "2ba801da6ce02dd1c2d21231acf102411f6897dd81722f5fc158c4a5a20e397c" + }, + "soa75k": { + "archive_image_url": "https://web.archive.org/web/20251202162201im_/https://www.bhphotovideo.com/images/fb/sony_a7_v_mirrorless_camera_1935819.jpg", + "bytes": 684488, + "file": "images/products/soa75k.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sony_a7_v_mirrorless_camera_1935819.jpg", + "product": "Sony a7 V Mirrorless Camera with 28-70mm II Lens", + "sha256": "75f0969ce7ee1b3125fc9bc1cf120891e51f8efe0860a4da345dbe3beab14fb1" + }, + "soalcsh168": { + "archive_image_url": "https://web.archive.org/web/20251214185844im_/https://www.bhphotovideo.com/images/fb/sony_alc_sh168_lens_hood_1702566.jpg", + "bytes": 547686, + "file": "images/products/soalcsh168.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sony_alc_sh168_lens_hood_1702566.jpg", + "product": "Sony ALC-SH168 Lens Hood", + "sha256": "bc63358b25514b43dc91da3838f499dedba8594980d3a032385ef0a1e73f56ec" + }, + "soceag1920t": { + "archive_image_url": "https://web.archive.org/web/20260330193451im_/https://www.bhphotovideo.com/images/fb/sony_cea_g1920t_1920gb_cfexpress_4_0_type_1906928.jpg", + "bytes": 360856, + "file": "images/products/soceag1920t.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sony_cea_g1920t_1920gb_cfexpress_4_0_type_1906928.jpg", + "product": "Sony 1920GB CFexpress 4.0 Type A TOUGH Memory Card", + "sha256": "8b909995448ef60aecee440e7a77b268170486dc8cecdb35fca523aaab2b65b9" + }, + "sozve10kb": { + "archive_image_url": "https://web.archive.org/web/20251121074739im_/https://www.bhphotovideo.com/images/fb/sony_zve10kb_zv_e10_mirrorless_camera_with_1912025.jpg", + "bytes": 325741, + "file": "images/products/sozve10kb.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sony_zve10kb_zv_e10_mirrorless_camera_with_1912025.jpg", + "product": "Sony ZV-E10 Mirrorless Camera with 16-50mm f/3.5-5.6 II Lens (Black)", + "sha256": "9e2577d6c30ee01b7082002f8b3d293f5b952dbe24a127c5aa140b9e7a3e888b" + }, + "sozve10kw": { + "archive_image_url": "https://web.archive.org/web/20260723152537im_/https://www.bhphotovideo.com/images/fb/sony_zve10kw_zv_e10_mirrorless_camera_with_1912026.jpg", + "bytes": 274858, + "file": "images/products/sozve10kw.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/sony_zve10kw_zv_e10_mirrorless_camera_with_1912026.jpg", + "product": "Sony ZV-E10 Mirrorless Camera with 16-50mm f/3.5-5.6 II Lens (White)", + "sha256": "3ff788def79e966ef056ba71c2b83059283ddfd06a8da22453b93bdb73aa3995" + }, + "ted4ssd": { + "archive_image_url": "https://web.archive.org/web/20260418000924im_/https://www.bhphotovideo.com/images/fb/terramaster_d4_ssd_4_bay_m_2_usb4_40gbps_1908990.jpg", + "bytes": 44379, + "file": "images/products/ted4ssd.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/terramaster_d4_ssd_4_bay_m_2_usb4_40gbps_1908990.jpg", + "product": "TerraMaster D4 SSD 4-Bay M.2 USB4 Enclosure", + "sha256": "2b5a6fb4388bded730764ef0e2431588e88ad6b63d9c4155bdcc6f36aff0b0e1" + }, + "tef4ssd": { + "archive_image_url": "https://web.archive.org/web/20260815221421im_/https://www.bhphotovideo.com/images/fb/terramaster_f4_ssd_4_core_16_gpu_4k_1908994.jpg", + "bytes": 44379, + "file": "images/products/tef4ssd.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/terramaster_f4_ssd_4_core_16_gpu_4k_1908994.jpg", + "product": "TerraMaster F4 SSD 4-Bay NAS Enclosure", + "sha256": "2b5a6fb4388bded730764ef0e2431588e88ad6b63d9c4155bdcc6f36aff0b0e1" + }, + "templm401f40": { + "archive_image_url": "https://web.archive.org/web/20260603124207im_/https://www.bhphotovideo.com/images/fb/televic_71_98_0094_mike_gooseneck_mic_plm401f_1925084.jpg", + "bytes": 65393, + "file": "images/products/templm401f40.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/televic_71_98_0094_mike_gooseneck_mic_plm401f_1925084.jpg", + "product": "TELEVIC Mike PLM401F 16\" Single Flex Gooseneck Microphone", + "sha256": "e417a7bb01c47c2df8e63932cdfe5af02c594ec454eaa37a4d4f97d51de443f0" + }, + "tokpc3012mft": { + "archive_image_url": "https://web.archive.org/web/20260227070013im_/https://www.bhphotovideo.com/images/fb/tokina_kpc_3012mft_180mm_t1_9_vista_lens_1702392.jpg", + "bytes": 394913, + "file": "images/products/tokpc3012mft.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/tokina_kpc_3012mft_180mm_t1_9_vista_lens_1702392.jpg", + "product": "Tokina 180mm T1.9 Vista Cinema Prime (MFT Mount, Feet)", + "sha256": "b8721837cf03705d54aba7aa0f7e56ac5d8ac9053fc1fd7d2e7f3526e59cfdad" + }, + "tt40az": { + "archive_image_url": "https://web.archive.org/web/20251201122119im_/https://www.bhphotovideo.com/images/fb/ttartisan_af4020_z_b_af_40mm_f_2_lens_1911401.jpg", + "bytes": 357614, + "file": "images/products/tt40az.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/ttartisan_af4020_z_b_af_40mm_f_2_lens_1911401.jpg", + "product": "TTArtisan AF 40mm f/2 Lens (Nikon Z)", + "sha256": "9cc9fe1e62e74512872f1ad5349f2334a2e5d1fb41636059356de3d49ee37d68" + }, + "ttaf2318eb": { + "archive_image_url": "https://web.archive.org/web/20251201225037im_/https://www.bhphotovideo.com/images/fb/ttartisan_af2318_e_b_af_23mm_f_1_8_lens_1908688.jpg", + "bytes": 45284, + "file": "images/products/ttaf2318eb.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/ttartisan_af2318_e_b_af_23mm_f_1_8_lens_1908688.jpg", + "product": "TTArtisan AF 23mm f/1.8 Lens (Sony E)", + "sha256": "6f61bc5a160afe23d56169f0994ef670024ee8d3bb6df6f22167fd56982d8157" + }, + "ttaf7520xb": { + "archive_image_url": "https://web.archive.org/web/20260812230048im_/https://www.bhphotovideo.com/images/fb/ttartisan_af7520_x_b_af_75mm_f_2_lens_1914621.jpg", + "bytes": 58730, + "file": "images/products/ttaf7520xb.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/ttartisan_af7520_x_b_af_75mm_f_2_lens_1914621.jpg", + "product": "TTArtisan AF 75mm f/2 Lens (FUJIFILM X, Black)", + "sha256": "7566e4766f78a26a4a5851dc6e9287a7f7c1ec2a77c27ed45b33e617b2811810" + }, + "viaf3314e": { + "archive_image_url": "https://web.archive.org/web/20251206173119im_/https://www.bhphotovideo.com/images/fb/viltrox_af_33_1_4_e_33mm_f_1_4_lens_for_1607408.jpg", + "bytes": 736224, + "file": "images/products/viaf3314e.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/viltrox_af_33_1_4_e_33mm_f_1_4_lens_for_1607408.jpg", + "product": "Viltrox AF 33mm f/1.4 E Lens for Sony E (Black)", + "sha256": "4d25aaba9b3b3e6f925980853a1915cfcbaedd2a080c6175edb8cef3f7cc1d40" + }, + "viaf3512z": { + "archive_image_url": "https://web.archive.org/web/20260207232127im_/https://www.bhphotovideo.com/images/fb/viltrox_af_35_1_2_z_af_35mm_f_1_2_lens_1933792.jpg", + "bytes": 198629, + "file": "images/products/viaf3512z.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/viltrox_af_35_1_2_z_af_35mm_f_1_2_lens_1933792.jpg", + "product": "Viltrox AF 35mm f/1.2 LAB Z Lens (Nikon Z)", + "sha256": "13fe41e180d1b0e8d2f51f49503266125419dcc8ea2e92737fbb8da129070e7b" + }, + "voap3ac": { + "archive_image_url": "https://web.archive.org/web/20250407095035im_/https://www.bhphotovideo.com/images/fb/vox_ap3ac_headphone_amplifier_ac30_1806393.jpg", + "bytes": 710615, + "file": "images/products/voap3ac.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/vox_ap3ac_headphone_amplifier_ac30_1806393.jpg", + "product": "VOX amPlug 3 AC30 In-Line Headphone Amplifier", + "sha256": "c156e8379a176d9c2f876ea36f8e2bb9165ee2b3b761759fd635bd3e1ce93a61" + }, + "voap3ba": { + "archive_image_url": "https://web.archive.org/web/20250407094910im_/https://www.bhphotovideo.com/images/fb/vox_ap3ba_headphone_amplifier_bass_1806394.jpg", + "bytes": 603533, + "file": "images/products/voap3ba.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/vox_ap3ba_headphone_amplifier_bass_1806394.jpg", + "product": "VOX amPlug 3 Bass In-Line Headphone Amplifier", + "sha256": "f03e40f182dd3265044a093da1eb9acca8b6fa2565d0f302494dad6b42695310" + }, + "voap3bq": { + "archive_image_url": "https://web.archive.org/web/20250407095031im_/https://www.bhphotovideo.com/images/fb/vox_ap3bq_headphone_amplifier_boutique_1806395.jpg", + "bytes": 580567, + "file": "images/products/voap3bq.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/vox_ap3bq_headphone_amplifier_boutique_1806395.jpg", + "product": "VOX amPlug 3 Boutique In-Line Headphone Amplifier", + "sha256": "2e253ac3b889c5d36d5aa5b561d42f37a03f0392084eca0cca2813e761418a8f" + }, + "voap3hg": { + "archive_image_url": "https://web.archive.org/web/20250407095024im_/https://www.bhphotovideo.com/images/fb/vox_ap3hg_headphone_amplifier_high_gain_1806396.jpg", + "bytes": 585624, + "file": "images/products/voap3hg.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/vox_ap3hg_headphone_amplifier_high_gain_1806396.jpg", + "product": "VOX amPlug 3 High-Gain In-Line Headphone Amplifier", + "sha256": "1b0b9597e9e422c22516231ed38f1016a8dd53e9855fa5c5236112f3fbd31dae" + }, + "voap3mb": { + "archive_image_url": "https://web.archive.org/web/20250321001533im_/https://www.bhphotovideo.com/images/fb/vox_ap3mb_headphone_amplifier_modern_bass_1806397.jpg", + "bytes": 801711, + "file": "images/products/voap3mb.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/vox_ap3mb_headphone_amplifier_modern_bass_1806397.jpg", + "product": "VOX amPlug 3 Modern Bass In-Line Headphone Amplifier", + "sha256": "e69fdd04c62ccf6835d4bca47d99aa0f056d7aae05dda52ed94ac7fb1222f839" + }, + "voap3ud": { + "archive_image_url": "https://web.archive.org/web/20250407095022im_/https://www.bhphotovideo.com/images/fb/vox_ap3ud_headphone_amplifier_uk_drive_1806398.jpg", + "bytes": 659908, + "file": "images/products/voap3ud.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/vox_ap3ud_headphone_amplifier_uk_drive_1806398.jpg", + "product": "VOX amPlug 3 UK Drive In-Line Headphone Amplifier", + "sha256": "65908830b46b6f7dce3e2898acd1fec41fa6ee62b04cc12d705e2295634070cd" + }, + "voap3us": { + "archive_image_url": "https://web.archive.org/web/20250407094910im_/https://www.bhphotovideo.com/images/fb/vox_ap3us_headphone_amplifier_us_silver_1806399.jpg", + "bytes": 654756, + "file": "images/products/voap3us.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/vox_ap3us_headphone_amplifier_us_silver_1806399.jpg", + "product": "VOX amPlug 3 US Silver In-Line Headphone Amplifier", + "sha256": "8f8392aa41f55561220db24bf1f2b5ac2a1bed1cb5144f6250c220314a83337b" + }, + "vousbconfc8": { + "archive_image_url": "https://web.archive.org/web/20260227005108im_/https://www.bhphotovideo.com/images/fb/vocopro_usb_conference_8_8_user_wireless_microphone_usb_interface_1702058.jpg", + "bytes": 77637, + "file": "images/products/vousbconfc8.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/vocopro_usb_conference_8_8_user_wireless_microphone_usb_interface_1702058.jpg", + "product": "VocoPro USB-CONFERENCE-8 8-Person Wireless Microphone/USB Interface Package", + "sha256": "c83fd29117d434a9737c014f572ba9baba216077df4abdc7490be7bd8a339b81" + }, + "wiw5695": { + "archive_image_url": "https://web.archive.org/web/20251017010612im_/https://static.bhphoto.com/images/en/na500x500.jpg", + "bytes": 3763, + "file": "images/products/wiw5695.jpg", + "original_image_url": "https://static.bhphoto.com/images/en/na500x500.jpg", + "product": "Winsted Horizontal 6 Monitor Mount", + "sha256": "4e3b19a088c9b214a0796704f74c4596c0c0180d20a2283e3e2f1ee3016237a1" + } +} \ No newline at end of file diff --git a/sites/bh_photo/seed_data.py b/sites/bh_photo/seed_data.py index f793fd2a8..a48cc4e6a 100644 --- a/sites/bh_photo/seed_data.py +++ b/sites/bh_photo/seed_data.py @@ -1,1211 +1,172 @@ -import shutil -from datetime import datetime, timedelta -from pathlib import Path - +"""Build the B&H Photo mirror database. -MIRROR_REFERENCE_DATE = datetime(2026, 4, 18, 10, 0, 0) -BENCHMARK_PASSWORD = "TestPass123!" +Two kinds of data live in this seed and they are kept strictly apart. +**Sourced catalog.** Departments, brands, products, prices, availability, +conditions, descriptions and every specification row come from +`source_catalog.json`, which `sources/build_manifest.py` writes from dated +Internet Archive captures of bhphotovideo.com. Each product carries the capture +URL and timestamp it was read from. A value the source does not state is stored +empty, never invented. -CATEGORY_DEFS = [ - {"name": "Photography", "slug": "photography", "description": "Camera bodies, lenses, support gear, and storage built for stills workflows.", "hero_copy": "Browse mirrorless cameras, pro lenses, support systems, and storage cards with filter-heavy B&H style browsing.", "icon_label": "Photo", "nav_order": 1}, - {"name": "Video", "slug": "video", "description": "Cinema capture, drones, monitors, and production bundles for hybrid teams.", "hero_copy": "Explore cinema cameras, drones, monitor recorders, and creator-focused video production tools.", "icon_label": "Video", "nav_order": 2}, - {"name": "Audio", "slug": "audio", "description": "Microphones, monitoring, and recording tools for creators and live production.", "hero_copy": "Compare wireless kits, broadcast mics, and reference headphones with pickup and bundle options.", "icon_label": "Audio", "nav_order": 3}, - {"name": "Computers", "slug": "computers", "description": "Workstations, displays, and print gear for post-production and studio delivery.", "hero_copy": "Shop creator laptops, calibration-ready monitors, and output devices with side-by-side spec comparisons.", "icon_label": "Compute", "nav_order": 4}, - {"name": "Lighting", "slug": "lighting", "description": "LED fixtures, modifiers, and kits for photo and video sets.", "hero_copy": "Find compact LEDs, RGB panels, and soft source kits with realistic tech specs and stock badges.", "icon_label": "Light", "nav_order": 5}, - {"name": "Mirrorless Cameras", "slug": "mirrorless-cameras", "parent": "photography", "description": "Hybrid stills and video camera bodies."}, - {"name": "DSLR Cameras", "slug": "dslr-cameras", "parent": "photography", "description": "Optical viewfinder cameras for sports and studio work."}, - {"name": "Camera Lenses", "slug": "camera-lenses", "parent": "photography", "description": "Wide, standard, and telephoto glass across major mounts."}, - {"name": "Tripods & Supports", "slug": "tripods-supports", "parent": "photography", "description": "Travel, studio, and video support tools."}, - {"name": "Memory Cards & Storage", "slug": "memory-cards-storage", "parent": "photography", "description": "Capture media, SSDs, and workflow storage."}, - {"name": "Cinema Cameras", "slug": "cinema-cameras", "parent": "video", "description": "Compact and studio-ready digital cinema tools."}, - {"name": "Drones", "slug": "drones", "parent": "video", "description": "Aerial platforms for creator and production teams."}, - {"name": "Monitors & Recorders", "slug": "monitors-recorders", "parent": "video", "description": "Field monitors, recorders, and director displays."}, - {"name": "Microphones", "slug": "microphones", "parent": "audio", "description": "Wireless, shotgun, and desktop recording microphones."}, - {"name": "Headphones", "slug": "headphones", "parent": "audio", "description": "Reference and field monitoring headphones."}, - {"name": "Laptops", "slug": "laptops", "parent": "computers", "description": "Creator laptops for edit, color, and tethered capture."}, - {"name": "Monitors", "slug": "monitors", "parent": "computers", "description": "Color-critical and office monitors."}, - {"name": "Printers & Scanners", "slug": "printers-scanners", "parent": "computers", "description": "Proofing printers and document/photo scanners."}, - {"name": "Lighting", "slug": "lighting-kits", "parent": "lighting", "description": "LED monolights, RGB panels, and modifiers."}, -] +**Declared benchmark state.** Accounts, reviews, questions, answers, bundles, +deals, store inventory, carts, wishlists, comparisons, orders and reservations +are generated here. They are the state a web-agent benchmark needs and they do +not claim to mirror anything upstream. Every generated value is derived from a +hash of the product SKU, so the database is byte-reproducible from this file +plus the manifest. +Reproducibility rules that this module must keep: -BRAND_DEFS = [ - ("Canon", "Japan", "#d0282b", "Hybrid stills and imaging tools with strong autofocus and creator-friendly ergonomics."), - ("Nikon", "Japan", "#ffd334", "Photo-forward systems known for dependable handling and deep color."), - ("Sony", "Japan", "#2a3a63", "Hybrid imaging, creator audio, and monitoring gear with modern connectivity."), - ("Fujifilm", "Japan", "#7d1f2c", "Compact creator cameras and film-inspired imaging tools."), - ("Panasonic", "Japan", "#39435f", "Video-centric bodies and compact cinema hardware."), - ("Blackmagic", "Australia", "#202020", "Cinema capture systems and production monitoring gear."), - ("Sigma", "Japan", "#54606c", "Art and contemporary lenses with sharp optical design."), - ("Tamron", "Japan", "#0d6b57", "Flexible travel zooms and compact creator glass."), - ("DJI", "China", "#1d1d1d", "Aerial and wireless capture tools for modern production."), - ("Rode", "Australia", "#1776b6", "Portable audio capture and creator microphones."), - ("Sennheiser", "Germany", "#0a3f8c", "Reference monitoring and broadcast audio solutions."), - ("SanDisk", "United States", "#cc1f24", "High-speed capture media and rugged SSD storage."), - ("Lexar", "United States", "#bf7d0a", "Workflow media and creator storage accessories."), - ("Apple", "United States", "#4d4d4d", "Portable creator computers and calibrated displays."), - ("Dell", "United States", "#1563c7", "Workstations, creator laptops, and high-resolution monitors."), - ("BenQ", "Taiwan", "#4f6d52", "Color-accurate displays for editing and retouching."), - ("Aputure", "China", "#a05b10", "Professional LED lighting systems for location and studio setups."), - ("Manfrotto", "Italy", "#8f2334", "Tripods and supports for field production."), - ("Peak Design", "United States", "#333333", "Creator carry gear and modular support accessories."), - ("Atomos", "Australia", "#ea5a0b", "Field monitors and recorders for production crews."), - ("Shure", "United States", "#5a1d4c", "Reliable speech, podcast, and broadcast capture."), - ("ASUS", "Taiwan", "#1e5aa8", "Creator and pro-performance notebooks and monitors."), - ("Epson", "Japan", "#2e5d98", "Photo output and scanning tools for studio workflows."), - ("Godox", "China", "#825700", "Accessible lighting tools with strong feature density."), - ("Benro", "China", "#00584c", "Video heads and compact supports for travel production."), -] +* every ``seed_*`` entry point early-returns on a populated database +* no clock reads, no ``random`` without a fixed derivation, no network +* benchmark passwords hash with a fixed salt so a rebuild matches byte for byte +""" +from __future__ import annotations -STORE_DEFS = [ - ("NYC SuperStore", "nyc-superstore", "New York", "NY", "420 Demo Ave, Manhattan, NY 10001", "Mon-Sat 9am-8pm", "(212) 555-0140", "Local benchmark pickup counter"), - ("Brooklyn Creator Desk", "brooklyn-creator-desk", "Brooklyn", "NY", "55 Flatbush Demo Way, Brooklyn, NY 11217", "Daily 10am-7pm", "(718) 555-0111", "Fast bag-and-tag reservation lane"), - ("Jersey City Pro Hub", "jersey-city-pro-hub", "Jersey City", "NJ", "91 Harbor Plaza, Jersey City, NJ 07302", "Mon-Sat 10am-6pm", "(201) 555-0168", "Broadcast and cinema pickup"), - ("White Plains Pickup", "white-plains-pickup", "White Plains", "NY", "17 Mamaroneck Ave, White Plains, NY 10601", "Tue-Sun 10am-6pm", "(914) 555-0122", "Suburban pickup desk"), - ("Los Angeles Creator Hub", "los-angeles-creator-hub", "Los Angeles", "CA", "300 Olive St, Los Angeles, CA 90013", "Daily 10am-7pm", "(323) 555-0185", "West coast same-day counter"), - ("Chicago Pro Counter", "chicago-pro-counter", "Chicago", "IL", "201 State St, Chicago, IL 60601", "Mon-Sat 9am-7pm", "(312) 555-0199", "Lighting and grip reserve desk"), - ("Miami Imaging Desk", "miami-imaging-desk", "Miami", "FL", "88 Biscayne Blvd, Miami, FL 33132", "Daily 11am-7pm", "(305) 555-0156", "Aerial and imaging pickup"), - ("Austin Broadcast Pickup", "austin-broadcast-pickup", "Austin", "TX", "620 Congress Ave, Austin, TX 78701", "Mon-Fri 9am-6pm", "(512) 555-0137", "Compact pro video counter"), -] +import hashlib +import json +import re +from datetime import datetime, timedelta +from pathlib import Path +MIRROR_REFERENCE_DATE = datetime(2026, 4, 18, 10, 0, 0) +BENCHMARK_PASSWORD = "TestPass123!" +MANIFEST_NAME = "source_catalog.json" + +# The one real B&H retail counter, read from the upstream page footer +# ("B&H Photo Video. 420 9th Ave, New York, NY, 10001"). B&H operates a single +# store, so the mirror ships one pickup location rather than inventing a chain. +STORE = { + "name": "B&H SuperStore", + "slug": "bh-superstore-nyc", + "city": "New York", + "state": "NY", + "address": "420 9th Ave, New York, NY 10001", + "pickup_hours": "Mon-Thu 9:30am-7pm, Fri 9:30am-1pm, Sun 10am-6pm", + "contact_phone": "800-606-6969", + "inventory_note": "Pickup counts in this mirror are benchmark state, not live inventory.", +} USER_DEFS = [ - {"username": "alice_j", "email": "alice.j@test.com", "display_name": "Alice Johnson", "company": "Northlight Weddings", "role": "Photographer"}, - {"username": "bob_c", "email": "bob.c@test.com", "display_name": "Bob Chen", "company": "Studio Meridian", "role": "Video Producer"}, - {"username": "carol_d", "email": "carol.d@test.com", "display_name": "Carol Davis", "company": "Signal Audio", "role": "Podcast Producer"}, - {"username": "david_k", "email": "david.k@test.com", "display_name": "David Kim", "company": "Frame & Color", "role": "Editor"}, + {"email": "alice.j@test.com", "username": "alicej", "display_name": "Alice Johnson", + "company": "Northlight Weddings", "role": "Photographer"}, + {"email": "bob.c@test.com", "username": "bobc", "display_name": "Bob Chen", + "company": "Chen Motion", "role": "Cinematographer"}, + {"email": "carol.d@test.com", "username": "carold", "display_name": "Carol Davis", + "company": "Davis Audio Post", "role": "Audio Engineer"}, + {"email": "david.k@test.com", "username": "davidk", "display_name": "David Kim", + "company": "Kim Studio Systems", "role": "Systems Integrator"}, ] +REVIEW_AUTHORS = ["Jordan P.", "Riley M.", "Sam O.", "Avery L.", "Casey T.", "Drew B."] +REVIEW_HEADLINES = [ + "Holds up on long shoots", "Exactly what the spec sheet promises", + "Solid build, predictable results", "Worth the upgrade", + "Good value for the feature set", "Does one job and does it well", +] +QUESTION_TEMPLATES = [ + "Is this covered by the standard return window?", + "Does this ship with the manufacturer warranty?", + "Can this item be collected at the store counter?", + "What is in the box besides the item itself?", +] +ANSWER_TEMPLATES = [ + "Yes. The return window shown on this page applies to this item.", + "Yes, the warranty stated in the product details is included.", + "Store pickup is offered wherever this page shows counter stock.", + "The box contents follow the manufacturer's standard packaging.", +] -def slugify(text: str) -> str: - return ( - text.lower() - .replace("&", " and ") - .replace("+", " plus ") - .replace("/", " ") - .replace("'", "") - .replace(",", " ") - .replace(".", " ") - ).strip().replace(" ", " ").replace(" ", "-") - - -def ensure_svg(path: Path, title: str, subtitle: str, accent: str, product_type: str) -> None: - path.parent.mkdir(parents=True, exist_ok=True) - if path.exists(): - return - if product_type in {"Mirrorless Camera", "DSLR Camera", "Cinema Camera"}: - silhouette = """ - - - - - - """ - elif product_type == "Lens": - silhouette = """ - - - - - - """ - elif product_type in {"Tripod", "Support"}: - silhouette = """ - - - - - - """ - elif product_type in {"Microphone", "Headphones"}: - silhouette = """ - - - - - """ - elif product_type in {"Drone"}: - silhouette = """ - - - - - - - - - - """ - elif product_type in {"Laptop", "Monitor", "Monitor/Recorder"}: - silhouette = """ - - - - - """ - elif product_type in {"Printer", "Scanner"}: - silhouette = """ - - - - - """ - else: - silhouette = """ - - - - """ - - svg = f""" - - - - - - - - - - - - -B&H DEMO -{silhouette.format(accent=accent)} -{title[:34]} -{subtitle[:54]} -""" - path.write_text(svg, encoding="utf-8") - - -def ensure_misc_assets(base_dir: str) -> None: - images_dir = Path(base_dir) / "static" / "images" - ensure_svg(images_dir / "bh-photo-fallback.svg", "B&H Demo", "Deterministic local benchmark asset", "#24423f", "Monitor") - - -def spec_groups_from_sections(sections): - return [{"title": title, "rows": rows} for title, rows in sections] - - -def camera_specs(sensor, megapixels, mount, video, slots, burst, stabilization, battery, weight, autofocus, viewfinder): - return spec_groups_from_sections( - [ - ("Key Specs", [("Sensor Size", sensor), ("Effective Megapixels", f"{megapixels} MP"), ("Lens Mount", mount), ("Recording", video)]), - ("Performance", [("Card Slots", slots), ("Continuous Shooting", burst), ("Stabilization", stabilization), ("Autofocus", autofocus)]), - ("General", [("Battery Life", battery), ("Viewfinder", viewfinder), ("Weight", weight), ("Warranty", "1 Year Demo Warranty")]), - ] - ) - - -def lens_specs(mount, focal, aperture, filter_size, stabilization, close_focus, weight, construction): - bucket = "Wide" if "16-" in focal or "14-" in focal else "Telephoto" if "70-" in focal or "100-" in focal else "Standard" - return bucket, spec_groups_from_sections( - [ - ("Optics", [("Lens Mount", mount), ("Focal Length", focal), ("Maximum Aperture", aperture), ("Optical Design", construction)]), - ("Focus", [("Image Stabilization", stabilization), ("Minimum Focus Distance", close_focus), ("Filter Thread", filter_size), ("Autofocus Drive", "Linear motor")]), - ("Physical", [("Weather Resistance", "Dust and moisture sealed"), ("Weight", weight), ("Included Accessories", "Hood, caps, soft case"), ("Warranty", "1 Year Demo Warranty")]), - ] - ) - - -def cinema_specs(sensor, video, dynamic_range, media, inputs, weight, mount): - return spec_groups_from_sections( - [ - ("Capture", [("Sensor Size", sensor), ("Recording Formats", video), ("Dynamic Range", dynamic_range), ("Lens Mount", mount)]), - ("Workflow", [("Media Support", media), ("Audio Inputs", inputs), ("Monitoring", "5-inch daylight touchscreen"), ("Power", "NP-F or V-Mount compatible")]), - ("Physical", [("Body Style", "Production-ready compact cinema body"), ("Weight", weight), ("Warranty", "1 Year Demo Warranty"), ("Notes", "Synthetic local benchmark inventory")]), - ] - ) - - -def tripod_specs(material, payload, height, folded, head, weight): - return spec_groups_from_sections( - [ - ("Support", [("Material", material), ("Max Payload", payload), ("Max Height", height), ("Folded Length", folded)]), - ("Head", [("Head Type", head), ("Quick Release", "Arca-compatible"), ("Leg Sections", "4"), ("Feet", "Rubber and spike set")]), - ("General", [("Weight", weight), ("Warranty", "5 Year Demo Support"), ("Travel Bag", "Included"), ("Use Case", "Synthetic pickup-ready studio support")]), - ] - ) - - -def storage_specs(capacity, form_factor, read_speed, write_speed, interface, weight): - return spec_groups_from_sections( - [ - ("Media", [("Capacity", capacity), ("Form Factor", form_factor), ("Read Speed", read_speed), ("Write Speed", write_speed)]), - ("Workflow", [("Interface", interface), ("Capture Use", "Hybrid photo and video"), ("Warranty", "Limited lifetime demo coverage"), ("Ruggedization", "Shock and temperature resistant")]), - ("Physical", [("Weight", weight), ("Labeling", "Preformatted for deterministic mirror tasks"), ("Color", "Black / graphite"), ("Included", "Protective case or cable where applicable")]), - ] - ) - - -def lighting_specs(output, cct, cri, power, control, weight): - return spec_groups_from_sections( - [ - ("Light Engine", [("Output", output), ("Color Temperature", cct), ("CRI/TLCI", cri), ("Power Draw", power)]), - ("Control", [("Control Options", control), ("Effects", "Builtin lighting effects"), ("Cooling", "Low-noise active cooling"), ("Mount", "Bowens or yoke mount")]), - ("Physical", [("Weight", weight), ("Power Supply", "AC adapter included"), ("Warranty", "1 Year Demo Warranty"), ("Notes", "Local synthetic stock only")]), - ] - ) - - -def audio_specs(pattern, response, connectivity, power, weight, bundle_note): - return spec_groups_from_sections( - [ - ("Audio", [("Polar Pattern", pattern), ("Frequency Response", response), ("Connectivity", connectivity), ("Power", power)]), - ("Workflow", [("Monitoring", "3.5mm headphone monitoring"), ("Mounting", bundle_note), ("Compatibility", "Mac, Windows, iOS, and Android demo workflows"), ("Warranty", "2 Year Demo Warranty")]), - ("Physical", [("Weight", weight), ("Included", "Protective pouch and cables"), ("Finish", "Matte black"), ("Notes", "Synthetic local benchmark media gear")]), - ] - ) - - -def drone_specs(sensor, video, flight_time, avoidance, transmission, weight): - return spec_groups_from_sections( - [ - ("Flight", [("Sensor", sensor), ("Video", video), ("Max Flight Time", flight_time), ("Obstacle Avoidance", avoidance)]), - ("Control", [("Transmission", transmission), ("Storage", "Internal plus microSD"), ("Modes", "Follow, orbit, waypoint"), ("Battery", "Two-battery demo kit supported")]), - ("Physical", [("Weight", weight), ("Warranty", "1 Year Demo Warranty"), ("Notes", "No real flight or registration required"), ("Carrying Case", "Included in Fly More bundles")]), - ] - ) - - -def computer_specs(processor, memory, storage, display, ports, connectivity, weight): - return spec_groups_from_sections( - [ - ("Performance", [("Processor", processor), ("Memory", memory), ("Storage", storage), ("Display", display)]), - ("I/O", [("Ports", ports), ("Connectivity", connectivity), ("Color Management", "Factory calibration included"), ("Warranty", "1 Year Demo Warranty")]), - ("General", [("Weight", weight), ("Use Case", "Editing, ingest, and tethered capture"), ("OS", "Synthetic local benchmark image"), ("Notes", "No external activation required")]), - ] - ) - - -def monitor_specs(size, resolution, color, hdr, inputs, weight): - return spec_groups_from_sections( - [ - ("Display", [("Panel Size", size), ("Resolution", resolution), ("Color Coverage", color), ("HDR", hdr)]), - ("Connectivity", [("Inputs", inputs), ("Calibration", "Hardware LUT support"), ("USB Hub", "Integrated"), ("Warranty", "3 Year Demo Panel Coverage")]), - ("Physical", [("Weight", weight), ("Ergonomics", "Height, tilt, swivel"), ("Included", "Cables and shading hood where applicable"), ("Notes", "Synthetic creator monitor stock")]), - ] - ) - - -def printer_specs(media, resolution, speed, ink, connectivity, weight): - return spec_groups_from_sections( - [ - ("Output", [("Supported Media", media), ("Max Resolution", resolution), ("Print / Scan Speed", speed), ("Ink or Sensor", ink)]), - ("Connectivity", [("Connectivity", connectivity), ("Workflow", "Proofing and delivery"), ("Warranty", "1 Year Demo Warranty"), ("Notes", "Synthetic benchmark hardware")]), - ("Physical", [("Weight", weight), ("Included", "Starter supplies"), ("Footprint", "Studio desktop"), ("Support", "Local-only demo contact flow")]), - ] - ) - - -def make_product( - *, - name, - brand, - category_slug, - top_category_slug, - product_type, - short_description, - description, - price, - list_price, - rating, - review_count, - qa_count, - best_seller_rank, - sort_newness, - accent_color, - specs, - search_blob="", - condition="New", - availability="In Stock", - stock_level=14, - pickup_available=True, - pickup_message="Ready in 2 hours", - shipping_message="Free Expedited Shipping", - return_window="30-Day Return Window", - warranty="1 Year Demo Warranty", - product_family="", - sensor_size="", - mount_type="", - focal_length="", - focal_length_bucket="", - megapixels=0, - capacity_gb=0, - connectivity="", - release_label="Spring 2025", - featured=False, - bundle_anchor=False, - used_highlight=False, - variants=None, - deal_label="", - deal_type="sale", -): - slug = slugify(name) - sku = f"BH{best_seller_rank:05d}" - return { - "name": name, - "slug": slug, - "sku": sku, - "brand": brand, - "category_slug": category_slug, - "top_category_slug": top_category_slug, - "subcategory_slug": category_slug, - "product_type": product_type, - "product_family": product_family or category_slug, - "short_description": short_description, - "description": description, - "search_blob": search_blob, - "price": price, - "list_price": list_price, - "rating": rating, - "review_count": review_count, - "qa_count": qa_count, - "condition": condition, - "availability": availability, - "stock_level": stock_level, - "pickup_available": pickup_available, - "pickup_message": pickup_message, - "shipping_message": shipping_message, - "return_window": return_window, - "warranty": warranty, - "best_seller_rank": best_seller_rank, - "sort_newness": sort_newness, - "sensor_size": sensor_size, - "mount_type": mount_type, - "focal_length": focal_length, - "focal_length_bucket": focal_length_bucket, - "megapixels": megapixels, - "capacity_gb": capacity_gb, - "connectivity": connectivity, - "accent_color": accent_color, - "release_label": release_label, - "specs": specs, - "variants": variants or [], - "featured": featured, - "bundle_anchor": bundle_anchor, - "used_highlight": used_highlight, - "deal_label": deal_label, - "deal_type": deal_type, - } - - -def mirrorless_products(): - entries = [ - ("Sony Aurora A7X Mirrorless Camera", "Sony", 2498, 2798, 4.8, 188, "Full Frame", "Sony E", 33.0, "4K60 10-bit", "Dual CFexpress A / SD", "10 fps", "5-axis 7-stop IBIS", "610 shots", "673 g", "759k phase-detect", "3.69m-dot OLED EVF", True, True, "Free 2-day shipping"), - ("Canon Orbit R6 Mark II Mirrorless Camera", "Canon", 2299, 2499, 4.7, 164, "Full Frame", "Canon RF", 24.2, "4K60 oversampled", "Dual SD UHS-II", "12 fps mechanical", "5-axis 8-stop IBIS", "580 shots", "680 g", "Dual Pixel AF II", "3.69m-dot EVF", True, False, "Free expedited shipping"), - ("Nikon Zenith Z8 Mirrorless Camera", "Nikon", 3496, 3796, 4.9, 146, "Full Frame", "Nikon Z", 45.7, "8.3K60 RAW", "CFexpress B / SD", "20 fps RAW", "5-axis 6-stop VR", "530 shots", "910 g", "3D subject tracking", "3.69m-dot EVF", True, True, "Signature shipping included"), - ("Fujifilm Northlight X-T5 Mirrorless Camera", "Fujifilm", 1699, 1849, 4.8, 131, "APS-C", "Fujifilm X", 40.2, "6.2K30", "Dual SD UHS-II", "15 fps mechanical", "7-stop IBIS", "680 shots", "557 g", "Deep-learning AF", "3.69m-dot EVF", True, False, "Free 2-day shipping"), - ("Panasonic Lumix S5 II Mirrorless Camera", "Panasonic", 1997, 2197, 4.7, 119, "Full Frame", "L Mount", 24.2, "6K30 / 4K60", "Dual SD UHS-II", "9 fps mechanical", "5-axis 6.5-stop IBIS", "470 shots", "740 g", "Phase hybrid AF", "3.68m-dot OLED", True, False, "Free shipping"), - ("Sony Aurora A6700 Mirrorless Camera", "Sony", 1398, 1498, 4.7, 101, "APS-C", "Sony E", 26.0, "4K120", "Single SD UHS-II", "11 fps", "5-axis stabilization", "570 shots", "493 g", "AI subject recognition", "2.36m-dot OLED", True, False, "Fast creator shipping"), - ("Canon Orbit R8 Mirrorless Camera", "Canon", 1299, 1399, 4.6, 96, "Full Frame", "Canon RF", 24.2, "4K60", "Single SD UHS-II", "6 fps", "Digital stabilization", "420 shots", "461 g", "Dual Pixel AF II", "2.36m-dot EVF", True, False, "Free shipping"), - ("Nikon Zenith Zf Mirrorless Camera", "Nikon", 1896, 2046, 4.8, 88, "Full Frame", "Nikon Z", 24.5, "4K60", "Dual SD / microSD", "14 fps", "5-axis 8-stop VR", "410 shots", "710 g", "3D tracking", "3.69m-dot EVF", True, False, "Free expedited shipping"), - ("Fujifilm Northlight X-S20 Mirrorless Camera", "Fujifilm", 1299, 1399, 4.7, 82, "APS-C", "Fujifilm X", 26.1, "6.2K30", "Single SD UHS-II", "8 fps", "7-stop IBIS", "750 shots", "491 g", "Vlog-friendly AF", "2.36m-dot EVF", True, False, "Free shipping"), - ("Panasonic Lumix GH7 Mirrorless Camera", "Panasonic", 2197, 2397, 4.8, 76, "Micro Four Thirds", "MFT", 25.2, "5.7K60 ProRes", "CFexpress B / SD", "12 fps", "7.5-stop IBIS", "420 shots", "805 g", "Phase hybrid AF", "3.68m-dot OLED", True, False, "Pro video shipping"), - ("Sony Aurora A1C Mirrorless Camera", "Sony", 4498, 4798, 4.9, 65, "Full Frame", "Sony E", 50.1, "8K30 / 4K120", "Dual CFexpress A / SD", "30 fps", "5-axis 8-stop IBIS", "530 shots", "737 g", "AI subject recognition", "9.44m-dot EVF", True, True, "Priority insured shipping"), - ("Canon Orbit R50 V Mirrorless Camera", "Canon", 899, 999, 4.5, 73, "APS-C", "Canon RF", 24.2, "4K30", "Single SD UHS-II", "15 fps electronic", "Digital stabilization", "460 shots", "417 g", "Dual Pixel AF II", "2.36m-dot EVF", False, False, "Fast creator shipping"), - ] - records = [] - for idx, entry in enumerate(entries, start=1): - ( - name, brand, price, list_price, rating, review_count, sensor, mount, megapixels, video, slots, - burst, stabilization, battery, weight, autofocus, viewfinder, featured, bundle_anchor, ship_msg, - ) = entry - records.append( - make_product( - name=name, - brand=brand, - category_slug="mirrorless-cameras", - top_category_slug="photography", - product_type="Mirrorless Camera", - short_description="Hybrid mirrorless camera body for stills, creator video, and controlled studio work.", - description=f"{name} is part of the local B&H benchmark mirror. It combines responsive autofocus, dependable color, and pro-friendly media options for synthetic creator workflows.", - price=price, - list_price=list_price, - rating=rating, - review_count=review_count, - qa_count=9 + idx, - best_seller_rank=idx, - sort_newness=300 - idx, - accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), - specs=camera_specs(sensor, megapixels, mount, video, slots, burst, stabilization, battery, weight, autofocus, viewfinder), - search_blob=f"{brand} mirrorless {sensor} {mount} {video} creator camera photo video", - sensor_size=sensor, - mount_type=mount, - megapixels=megapixels, - connectivity="USB-C, HDMI, Wi-Fi, Bluetooth", - release_label="Spring 2025" if idx < 6 else "Fall 2024", - featured=featured, - bundle_anchor=bundle_anchor, - variants=[("Body Only", "Kit", "Body Only", 0), ("Creator Kit", "Kit", "Creator Kit", 299)], - deal_label="Deal Zone" if list_price > price else "", - ) - ) - return records - - -def dslr_products(start_rank): - entries = [ - ("Canon Terra 90D DSLR Camera", "Canon", 1149, 1299, 4.6, 118, 32.5, "Canon EF/EF-S", "4K30", "Single SD UHS-II", "10 fps", "Optical IS via lens", "1300 shots", "701 g"), - ("Nikon D780 Studio DSLR Camera", "Nikon", 1796, 1946, 4.7, 104, 24.5, "Nikon F", "4K30", "Dual SD UHS-II", "7 fps", "Optical VR via lens", "2260 shots", "840 g"), - ("Canon Terra Rebel T8 Creator DSLR", "Canon", 749, 829, 4.4, 92, 24.1, "Canon EF/EF-S", "4K24", "Single SD UHS-I", "7 fps", "Lens-based stabilization", "1240 shots", "515 g"), - ("Nikon D7500 Action DSLR", "Nikon", 896, 996, 4.6, 86, 20.9, "Nikon F", "4K30", "Single SD UHS-I", "8 fps", "Lens-based stabilization", "950 shots", "720 g"), - ("Canon Terra 5D Classic Refresh DSLR", "Canon", 1499, 1699, 4.5, 66, 30.4, "Canon EF", "4K30", "CF / SD dual", "7 fps", "Lens-based stabilization", "900 shots", "890 g"), - ("Nikon D850 Heritage DSLR", "Nikon", 2396, 2596, 4.8, 77, 45.7, "Nikon F", "4K30", "XQD / SD dual", "9 fps", "Lens-based stabilization", "1840 shots", "1005 g"), - ("Canon EOS 6D Mark Lite DSLR", "Canon", 999, 1129, 4.4, 59, 26.2, "Canon EF", "4K24", "Single SD UHS-I", "6.5 fps", "Lens-based stabilization", "1200 shots", "765 g"), - ("Nikon D5600 Travel DSLR", "Nikon", 699, 799, 4.3, 53, 24.2, "Nikon F", "Full HD", "Single SD UHS-I", "5 fps", "Lens-based stabilization", "970 shots", "465 g"), - ] - records = [] - for offset, entry in enumerate(entries): - name, brand, price, list_price, rating, review_count, mp, mount, video, slots, burst, stabilization, battery, weight = entry - records.append( - make_product( - name=name, - brand=brand, - category_slug="dslr-cameras", - top_category_slug="photography", - product_type="DSLR Camera", - short_description="Optical viewfinder camera body for still photography, event coverage, and classroom-friendly capture workflows.", - description=f"{name} mirrors a DSLR-focused B&H catalog entry with clear media, autofocus, and support notes for offline benchmark browsing.", - price=price, - list_price=list_price, - rating=rating, - review_count=review_count, - qa_count=6 + offset, - best_seller_rank=start_rank + offset, - sort_newness=250 - offset, - accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), - specs=camera_specs("APS-C" if mp < 25 else "Full Frame", mp, mount, video, slots, burst, stabilization, battery, weight, "Optical phase AF", "Optical pentaprism"), - search_blob=f"{brand} dslr optical viewfinder {mount} photography camera", - sensor_size="APS-C" if mp < 25 else "Full Frame", - mount_type=mount, - megapixels=mp, - connectivity="USB, HDMI, Wi-Fi", - release_label="Heritage Stock", - variants=[("Body Only", "Kit", "Body Only", 0), ("Starter Lens Kit", "Kit", "Starter Lens Kit", 179)], - deal_label="Photo Special" if price < list_price else "", - ) - ) - return records - - -def lens_products(start_rank): - entries = [ - ("Sigma ArtLine 24-70mm f/2.8 DG DN Lens", "Sigma", "Sony E", 1099, 1199, 4.8, 142, "24-70mm", "f/2.8", "82mm", "Optical stabilization", "0.18 m", "835 g", "19 elements in 15 groups", "Standard", "New"), - ("Tamron Travel 70-180mm f/2.8 Di III Lens", "Tamron", "Sony E", 1099, 1179, 4.7, 124, "70-180mm", "f/2.8", "67mm", "VC stabilization", "0.85 m", "810 g", "19 elements in 14 groups", "Telephoto", "New"), - ("Sony GM 16-35mm f/2.8 II Lens", "Sony", "Sony E", 2098, 2298, 4.9, 97, "16-35mm", "f/2.8", "82mm", "No optical stabilization", "0.22 m", "547 g", "15 elements in 12 groups", "Wide", "New"), - ("Canon RF 100-500mm f/4.5-7.1L Lens", "Canon", "Canon RF", 2699, 2899, 4.8, 93, "100-500mm", "f/4.5-7.1", "77mm", "Optical stabilization", "0.9 m", "1365 g", "20 elements in 14 groups", "Telephoto", "New"), - ("Nikon Z 24-120mm f/4 S Lens", "Nikon", "Nikon Z", 1096, 1196, 4.8, 88, "24-120mm", "f/4", "77mm", "No optical stabilization", "0.35 m", "630 g", "16 elements in 13 groups", "Standard", "New"), - ("Fujifilm XF 33mm f/1.4 R LM Lens", "Fujifilm", "Fujifilm X", 799, 899, 4.7, 82, "33mm", "f/1.4", "58mm", "No optical stabilization", "0.3 m", "360 g", "15 elements in 10 groups", "Standard", "New"), - ("Sigma ArtLine 85mm f/1.4 DG DN Lens", "Sigma", "Sony E", 999, 1099, 4.8, 75, "85mm", "f/1.4", "77mm", "No optical stabilization", "0.85 m", "625 g", "15 elements in 11 groups", "Telephoto", "Open-Box"), - ("Tamron Travel 28-75mm f/2.8 G2 Lens", "Tamron", "Sony E", 799, 899, 4.6, 120, "28-75mm", "f/2.8", "67mm", "No optical stabilization", "0.18 m", "540 g", "17 elements in 15 groups", "Standard", "New"), - ("Sony PZ 16-35mm f/4 G Lens", "Sony", "Sony E", 1198, 1298, 4.7, 71, "16-35mm", "f/4", "72mm", "Power zoom stabilization", "0.24 m", "353 g", "13 elements in 12 groups", "Wide", "New"), - ("Canon RF 24-105mm f/4L IS Lens", "Canon", "Canon RF", 1299, 1399, 4.7, 116, "24-105mm", "f/4", "77mm", "Optical stabilization", "0.45 m", "700 g", "18 elements in 14 groups", "Standard", "New"), - ("Nikon Z 70-200mm f/2.8 VR S Lens", "Nikon", "Nikon Z", 2396, 2496, 4.9, 68, "70-200mm", "f/2.8", "77mm", "VR stabilization", "0.5 m", "1360 g", "21 elements in 18 groups", "Telephoto", "New"), - ("Fujifilm XF 16-55mm f/2.8 WR II Lens", "Fujifilm", "Fujifilm X", 1249, 1349, 4.8, 59, "16-55mm", "f/2.8", "72mm", "No optical stabilization", "0.3 m", "660 g", "15 elements in 11 groups", "Wide", "New"), - ("Sigma Contemporary 18-50mm f/2.8 DC DN Lens", "Sigma", "Fujifilm X", 549, 629, 4.6, 64, "18-50mm", "f/2.8", "55mm", "No optical stabilization", "0.12 m", "285 g", "13 elements in 10 groups", "Wide", "Used"), - ("Tamron 17-70mm f/2.8 VC Lens", "Tamron", "Fujifilm X", 749, 849, 4.7, 66, "17-70mm", "f/2.8", "67mm", "VC stabilization", "0.19 m", "525 g", "16 elements in 12 groups", "Standard", "New"), - ("Sony FE 70-300mm f/4.5-5.6 G Lens", "Sony", "Sony E", 1248, 1348, 4.5, 52, "70-300mm", "f/4.5-5.6", "72mm", "Optical stabilization", "0.9 m", "854 g", "16 elements in 13 groups", "Telephoto", "Open-Box"), - ("Canon RF 35mm f/1.8 Macro IS Lens", "Canon", "Canon RF", 479, 549, 4.6, 97, "35mm", "f/1.8", "52mm", "Optical stabilization", "0.17 m", "305 g", "11 elements in 9 groups", "Standard", "New"), - ("Nikon Z 14-30mm f/4 S Lens", "Nikon", "Nikon Z", 1196, 1296, 4.8, 57, "14-30mm", "f/4", "82mm", "No optical stabilization", "0.28 m", "485 g", "14 elements in 12 groups", "Wide", "New"), - ("Panasonic Lumix 24-105mm f/4 Macro Lens", "Panasonic", "L Mount", 998, 1098, 4.6, 54, "24-105mm", "f/4", "77mm", "Optical stabilization", "0.3 m", "680 g", "16 elements in 13 groups", "Standard", "New"), - ("Sigma Sports 150-600mm f/5-6.3 DG DN Lens", "Sigma", "Sony E", 1499, 1599, 4.7, 49, "150-600mm", "f/5-6.3", "95mm", "Optical stabilization", "0.58 m", "2100 g", "25 elements in 15 groups", "Telephoto", "Used"), - ("Canon RF 16mm f/2.8 STM Lens", "Canon", "Canon RF", 279, 329, 4.4, 88, "16mm", "f/2.8", "43mm", "No optical stabilization", "0.13 m", "165 g", "9 elements in 7 groups", "Wide", "New"), - ("Sony FE 40mm f/2.5 G Lens", "Sony", "Sony E", 548, 598, 4.6, 46, "40mm", "f/2.5", "49mm", "No optical stabilization", "0.28 m", "173 g", "9 elements in 9 groups", "Standard", "Open-Box"), - ("Nikon Z 50mm f/1.8 S Lens", "Nikon", "Nikon Z", 526, 576, 4.8, 63, "50mm", "f/1.8", "62mm", "No optical stabilization", "0.4 m", "415 g", "12 elements in 9 groups", "Standard", "New"), - ("Tamron 150-500mm f/5-6.7 Di III VC Lens", "Tamron", "Sony E", 1299, 1399, 4.7, 43, "150-500mm", "f/5-6.7", "82mm", "VC stabilization", "0.6 m", "1725 g", "25 elements in 16 groups", "Telephoto", "New"), - ("Fujifilm XF 70-300mm f/4-5.6 OIS Lens", "Fujifilm", "Fujifilm X", 749, 829, 4.7, 58, "70-300mm", "f/4-5.6", "67mm", "Optical stabilization", "0.83 m", "580 g", "17 elements in 12 groups", "Telephoto", "New"), - ] - records = [] - for offset, entry in enumerate(entries): - ( - name, brand, mount, price, list_price, rating, review_count, focal, aperture, filter_size, - stabilization, close_focus, weight, construction, bucket, condition, - ) = entry - focal_bucket, specs = lens_specs(mount, focal, aperture, filter_size, stabilization, close_focus, weight, construction) - records.append( - make_product( - name=name, - brand=brand, - category_slug="camera-lenses", - top_category_slug="photography", - product_type="Lens", - short_description="Fast interchangeable lens with category-specific optical specs and comparison-friendly rows.", - description=f"{name} appears in the local B&H Photo mirror with focal length, stabilization, and compatibility details grounded in deterministic demo data.", - price=price, - list_price=list_price, - rating=rating, - review_count=review_count, - qa_count=7 + (offset % 6), - best_seller_rank=start_rank + offset, - sort_newness=220 - offset, - accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), - specs=specs, - search_blob=f"{brand} lens {mount} {focal} {aperture} {bucket.lower()} photography", - mount_type=mount, - focal_length=focal, - focal_length_bucket=focal_bucket, - connectivity="None", - condition=condition, - availability="In Stock" if condition != "Used" else "Limited Stock", - stock_level=6 if condition != "Used" else 2, - pickup_message="Ready today" if condition == "New" else "Ready tomorrow", - shipping_message="Insured lens delivery", - warranty="1 Year Demo Optics Coverage", - release_label="Spring 2024", - variants=[("Standard Finish", "Finish", "Standard Finish", 0), ("Protection Filter Bundle", "Bundle", "Protection Filter Bundle", 39)], - deal_label="Open-Box" if condition == "Open-Box" else ("Used Deal" if condition == "Used" else "Lens Sale"), - deal_type="open-box" if condition == "Open-Box" else ("used" if condition == "Used" else "sale"), - used_highlight=condition != "New", - ) - ) - return records - - -def cinema_products(start_rank): - entries = [ - ("Blackmagic Scout 6K Pro Cinema Camera", "Blackmagic", 2495, 2695, 4.8, 79, "Super 35", "6K Open Gate / 4K120", "13 stops", "CFexpress / USB-C SSD", "Mini XLR dual", "900 g", "Canon EF", True), - ("Panasonic EVA Core 6K Cinema Camera", "Panasonic", 3299, 3499, 4.7, 51, "Full Frame", "6K60 / 4K120", "14+ stops", "CFexpress B / SD", "Mini XLR dual", "1200 g", "L Mount", True), - ("Sony FX3 Creator Cinema Camera", "Sony", 3898, 4098, 4.9, 102, "Full Frame", "4K120", "15+ stops", "CFexpress A / SD", "XLR handle included", "715 g", "Sony E", True), - ("Canon C70 Motion Cinema Camera", "Canon", 4799, 4999, 4.8, 70, "Super 35 DGO", "4K120", "16+ stops", "Dual SD UHS-II", "Mini XLR dual", "1170 g", "Canon RF", True), - ("Blackmagic Pocket Forge 4K Cinema Camera", "Blackmagic", 1295, 1395, 4.6, 95, "Micro Four Thirds", "4K60", "13 stops", "CFast 2.0 / SD UHS-II", "Mini XLR", "722 g", "MFT", False), - ("Panasonic BoxCam BGH2 Pro Cinema Camera", "Panasonic", 1697, 1797, 4.5, 48, "Micro Four Thirds", "4K60", "13+ stops", "SD UHS-II", "3.5mm stereo", "545 g", "MFT", False), - ("Sony FX30 Studio Cinema Camera", "Sony", 1798, 1898, 4.8, 81, "APS-C", "4K120", "14+ stops", "CFexpress A / SD", "XLR via handle", "646 g", "Sony E", True), - ("Canon R5 C Motion Cinema Camera", "Canon", 3799, 3999, 4.7, 58, "Full Frame", "8K60 RAW", "14+ stops", "CFexpress B / SD", "3.5mm + digital hot shoe", "680 g", "Canon RF", True), - ("Blackmagic Studio Rack 12K Cinema Camera", "Blackmagic", 5995, 6295, 4.9, 35, "Full Frame", "12K60 RAW", "16 stops", "Dual CFexpress", "Mini XLR quad", "1800 g", "PL Mount", False), - ("Sony VENI Micro Cinema Unit", "Sony", 6995, 7295, 4.8, 27, "Full Frame", "6K60 / 4K120", "15+ stops", "CFexpress A", "XLR via adapter", "1350 g", "Sony E", False), - ] - records = [] - for offset, entry in enumerate(entries): - name, brand, price, list_price, rating, review_count, sensor, video, dynamic_range, media, inputs, weight, mount, pickup = entry - records.append( - make_product( - name=name, - brand=brand, - category_slug="cinema-cameras", - top_category_slug="video", - product_type="Cinema Camera", - short_description="Compact or production-ready cinema body with media, audio, and DR specs surfaced for comparison tasks.", - description=f"{name} is mirrored as a deterministic B&H pro video listing with no live services, no firmware checks, and no outside rental or reservation APIs.", - price=price, - list_price=list_price, - rating=rating, - review_count=review_count, - qa_count=8 + offset, - best_seller_rank=start_rank + offset, - sort_newness=200 - offset, - accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), - specs=cinema_specs(sensor, video, dynamic_range, media, inputs, weight, mount), - search_blob=f"{brand} cinema camera {sensor} {video} {mount}", - sensor_size=sensor, - mount_type=mount, - connectivity="USB-C, HDMI, Timecode", - availability="In Stock" if pickup else "Pre-Order", - stock_level=5 if pickup else 0, - pickup_available=pickup, - pickup_message="Pickup at flagship stores" if pickup else "Reserve for first shipment", - shipping_message="Signature video delivery", - release_label="Summer 2025", - bundle_anchor=offset < 4, - variants=[("Body Only", "Kit", "Body Only", 0), ("Production Bundle", "Kit", "Production Bundle", 499)], - deal_label="Video Event", - ) - ) - return records - - -def support_products(start_rank): - entries = [ - ("Manfrotto Carbon Travel Tripod Pro", "Manfrotto", 399, 469, 4.7, 94, "Carbon Fiber", "18 lb", "61.8 in", "17.3 in", "Ball Head", "3.2 lb"), - ("Benro Aero Video Tripod 8X", "Benro", 349, 399, 4.6, 71, "Aluminum", "13.2 lb", "65.1 in", "30.5 in", "Fluid Head", "5.1 lb"), - ("Peak Design Travel Support Carbon", "Peak Design", 599, 649, 4.8, 85, "Carbon Fiber", "20 lb", "60.2 in", "15.4 in", "Ball Head", "2.8 lb"), - ("Manfrotto Studio 055 Column Tripod", "Manfrotto", 289, 329, 4.5, 63, "Aluminum", "19.8 lb", "67.2 in", "25.6 in", "Column Head", "5.4 lb"), - ("Benro Slim Photo Tripod Kit", "Benro", 149, 179, 4.4, 58, "Aluminum", "8.8 lb", "57.5 in", "20.7 in", "Ball Head", "2.9 lb"), - ("Peak Design Mobile Creator Stand", "Peak Design", 119, 139, 4.3, 49, "Aluminum", "6 lb", "18.3 in", "11.0 in", "Phone Clamp", "1.2 lb"), - ("Manfrotto Nano Light Stand Duo", "Manfrotto", 99, 119, 4.4, 55, "Aluminum", "3 lb", "73.0 in", "19.0 in", "Stud Mount", "2.1 lb"), - ("Benro Hydra Adventure Tripod", "Benro", 279, 319, 4.6, 42, "Carbon Fiber", "15.4 lb", "60.1 in", "15.0 in", "Ball Head", "3.4 lb"), - ("Peak Design Everyday Sling 10L", "Peak Design", 149, 169, 4.7, 88, "Weatherproof Nylon", "10L carry", "n/a", "n/a", "Carry System", "1.9 lb"), - ("Manfrotto One-Step Monopod Pro", "Manfrotto", 189, 229, 4.5, 39, "Carbon Fiber", "15 lb", "63.0 in", "21.0 in", "Monopod Foot", "2.4 lb"), - ] - records = [] - for offset, entry in enumerate(entries): - name, brand, price, list_price, rating, review_count, material, payload, height, folded, head, weight = entry - product_type = "Support" if "Sling" in name else "Tripod" - specs = tripod_specs(material, payload, height, folded, head, weight) - records.append( - make_product( - name=name, - brand=brand, - category_slug="tripods-supports", - top_category_slug="photography", - product_type=product_type, - short_description="Support or carry solution with payload, travel, and pickup details surfaced for quick comparison.", - description=f"{name} is a deterministic support listing used for benchmark tasks around payload, travel size, and pickup availability.", - price=price, - list_price=list_price, - rating=rating, - review_count=review_count, - qa_count=4 + offset, - best_seller_rank=start_rank + offset, - sort_newness=180 - offset, - accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), - specs=specs, - search_blob=f"{brand} support tripod bag payload travel creator", - connectivity="None", - availability="In Stock" if offset < 8 else "Limited Stock", - stock_level=9 - (offset % 4), - pickup_message="Ready in 90 minutes", - shipping_message="Oversize support shipping" if "Studio" in name else "Free shipping", - release_label="Creator Support 2025", - deal_label="Support Sale", - used_highlight="Sling" in name, - condition="Used" if "Sling" in name else "New", - ) - ) - return records - - -def storage_products(start_rank): - entries = [ - ("SanDisk Pro Cinema CFexpress Type B 512GB Card", "SanDisk", 279, 319, 4.8, 147, 512, "Card", "1700 MB/s", "1400 MB/s", "CFexpress Type B", "0.03 lb", "New"), - ("Lexar Gold SDXC 256GB V90 Card", "Lexar", 199, 229, 4.7, 134, 256, "Card", "300 MB/s", "260 MB/s", "SDXC UHS-II", "0.01 lb", "New"), - ("SanDisk Extreme Portable SSD 2TB", "SanDisk", 189, 219, 4.7, 121, 2048, "Portable SSD", "1050 MB/s", "1000 MB/s", "USB-C 3.2 Gen 2", "0.17 lb", "New"), - ("Lexar Workflow Dock 4-Bay", "Lexar", 139, 159, 4.5, 76, 0, "Workflow Dock", "n/a", "n/a", "USB-C Dock", "1.5 lb", "New"), - ("SanDisk Ultra Luxe SDXC 128GB Card", "SanDisk", 39, 49, 4.4, 112, 128, "Card", "150 MB/s", "90 MB/s", "SDXC UHS-I", "0.01 lb", "New"), - ("Lexar Armor Gold CFexpress 1TB Card", "Lexar", 389, 419, 4.8, 64, 1024, "Card", "1900 MB/s", "1500 MB/s", "CFexpress Type B", "0.03 lb", "New"), - ("SanDisk ProBlade 4TB SSD Mag", "SanDisk", 349, 399, 4.6, 41, 4096, "SSD Mag", "2000 MB/s", "2000 MB/s", "USB-C Blade", "0.25 lb", "Open-Box"), - ("Lexar Pro Go Portable SSD 1TB", "Lexar", 119, 139, 4.5, 52, 1024, "Portable SSD", "1050 MB/s", "1000 MB/s", "USB-C 3.2 Gen 2", "0.2 lb", "New"), - ("SanDisk Creator microSD 512GB Card", "SanDisk", 69, 79, 4.4, 87, 512, "Card", "190 MB/s", "130 MB/s", "microSD UHS-I", "0.01 lb", "New"), - ("Lexar Silver SDXC 512GB Card", "Lexar", 69, 79, 4.3, 60, 512, "Card", "205 MB/s", "140 MB/s", "SDXC UHS-I", "0.01 lb", "Used"), - ("SanDisk Rugged Studio SSD 4TB", "SanDisk", 499, 549, 4.7, 34, 4096, "Desktop SSD", "3000 MB/s", "2500 MB/s", "Thunderbolt 4", "1.8 lb", "New"), - ("Lexar Capture Hub Reader", "Lexar", 79, 89, 4.2, 29, 0, "Card Reader", "n/a", "n/a", "USB-C Reader", "0.25 lb", "New"), - ] - records = [] - for offset, entry in enumerate(entries): - name, brand, price, list_price, rating, review_count, capacity_gb, form_factor, read_speed, write_speed, interface, weight, condition = entry - records.append( - make_product( - name=name, - brand=brand, - category_slug="memory-cards-storage", - top_category_slug="photography", - product_type="Storage", - short_description="Capture media or SSD workflow hardware with capacity, speed, and interface filters baked in.", - description=f"{name} is mirrored as deterministic media inventory with readable throughput specs and creator workflow metadata.", - price=price, - list_price=list_price, - rating=rating, - review_count=review_count, - qa_count=5 + offset, - best_seller_rank=start_rank + offset, - sort_newness=160 - offset, - accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), - specs=storage_specs(f"{capacity_gb} GB" if capacity_gb and capacity_gb < 1024 else (f"{capacity_gb // 1024} TB" if capacity_gb else "Accessory"), form_factor, read_speed, write_speed, interface, weight), - search_blob=f"{brand} storage media {form_factor} {capacity_gb}gb {interface}", - capacity_gb=capacity_gb, - connectivity=interface, - availability="In Stock" if condition == "New" else "Limited Stock", - stock_level=8 if condition == "New" else 2, - pickup_message="Ready in 1 hour", - shipping_message="Free media shipping", - release_label="Workflow 2025", - condition=condition, - used_highlight=condition != "New", - deal_label="Storage Deal" if condition == "New" else condition, - deal_type="sale" if condition == "New" else condition.lower(), - ) - ) - return records - - -def lighting_products(start_rank): - entries = [ - ("Aputure Storm 300x Bi-Color LED", "Aputure", 949, 1049, 4.8, 96, "58,000 lux at 1m", "2700-6500K", "CRI 96 / TLCI 97", "300W", "Sidus Link app, DMX, onboard", "6.4 lb"), - ("Godox LiteMax 200 RGB Fixture", "Godox", 499, 569, 4.6, 72, "26,000 lux at 1m", "2800-10,000K RGB", "CRI 95 / TLCI 95", "200W", "Bluetooth app, onboard", "4.8 lb"), - ("Aputure Nova Slim 1x1 Panel", "Aputure", 699, 779, 4.7, 58, "18,000 lux at 1m", "2700-6500K", "CRI 96 / TLCI 97", "200W", "Sidus Link app, DMX, CRMX", "7.5 lb"), - ("Godox FlexBeam 100 Portable LED", "Godox", 229, 259, 4.5, 63, "8,500 lux at 1m", "2700-6500K", "CRI 96 / TLCI 96", "100W", "App control, onboard", "2.8 lb"), - ("Aputure Infinibar 4-Light Kit", "Aputure", 1129, 1249, 4.8, 41, "RGB pixel bar set", "2000-10,000K", "CRI 95 / TLCI 98", "400W total", "App control, DMX, CRMX", "12.0 lb"), - ("Godox SL150III Daylight Monolight", "Godox", 329, 369, 4.4, 74, "74,300 lux at 1m", "5600K", "CRI 96 / TLCI 97", "160W", "App control, onboard", "4.2 lb"), - ("Aputure MC Pro Pocket RGB Light", "Aputure", 199, 229, 4.6, 83, "Pocket accent light", "2000-10,000K", "CRI 96 / TLCI 97", "5W", "App control", "0.6 lb"), - ("Godox TubeFlow RGB Pair", "Godox", 279, 319, 4.5, 34, "RGB tube pair", "2700-8500K", "CRI 95 / TLCI 96", "50W total", "App control", "2.4 lb"), - ("Aputure Fresnel 2x Modifier", "Aputure", 149, 169, 4.6, 44, "Modifier", "n/a", "n/a", "Passive", "Manual focus beam", "2.1 lb"), - ("Godox Lantern Dome Softbox 65cm", "Godox", 89, 99, 4.3, 57, "Modifier", "n/a", "n/a", "Passive", "Quick-release mount", "1.8 lb"), - ("Aputure Amaran 150c RGB Monolight", "Aputure", 359, 399, 4.6, 52, "15,610 lux at 1m", "2500-7500K RGB", "CRI 95 / TLCI 96", "180W", "App control, onboard", "6.0 lb"), - ("Godox Knowled M300Bi", "Godox", 879, 949, 4.7, 29, "85,700 lux at 1m", "2800-6500K", "CRI 97 / TLCI 98", "330W", "App, DMX, CRMX", "7.4 lb"), - ] - records = [] - for offset, entry in enumerate(entries): - name, brand, price, list_price, rating, review_count, output, cct, cri, power, control, weight = entry - product_type = "Lighting" - records.append( - make_product( - name=name, - brand=brand, - category_slug="lighting-kits", - top_category_slug="lighting", - product_type=product_type, - short_description="Lighting fixture or modifier with output, color, and control specs surfaced for studio shopping tasks.", - description=f"{name} appears in the local mirror with enough tech detail to compare output, control options, and bundle readiness without contacting any live vendor system.", - price=price, - list_price=list_price, - rating=rating, - review_count=review_count, - qa_count=4 + offset, - best_seller_rank=start_rank + offset, - sort_newness=140 - offset, - accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), - specs=lighting_specs(output, cct, cri, power, control, weight), - search_blob=f"{brand} lighting led rgb bi-color output app control", - connectivity="Bluetooth, DMX" if "DMX" in control else "Bluetooth", - availability="In Stock", - stock_level=8, - pickup_message="Pickup ready by afternoon", - shipping_message="Studio gear shipping", - release_label="Studio Light 2025", - featured=offset < 2, - deal_label="Lighting Event", - ) - ) - return records - - -def microphone_products(start_rank): - entries = [ - ("Rode Wireless Creator Duo", "Rode", 299, 329, 4.8, 155, "Omnidirectional", "20 Hz - 20 kHz", "2.4 GHz, USB-C, 3.5mm", "Internal battery", "0.3 lb", "Dual transmitter kit"), - ("DJI Mic Air 2TX Kit", "DJI", 349, 379, 4.7, 101, "Omnidirectional", "50 Hz - 20 kHz", "2.4 GHz, USB-C, Lightning", "Internal battery", "0.35 lb", "Dual transmitter kit"), - ("Shure MVX2 USB Stream Mic", "Shure", 229, 249, 4.6, 88, "Cardioid", "50 Hz - 16 kHz", "USB-C, 3.5mm", "USB bus power", "0.9 lb", "Desktop yoke mount"), - ("Rode NTG Creator Shotgun", "Rode", 249, 279, 4.6, 65, "Supercardioid", "20 Hz - 20 kHz", "XLR, 3.5mm", "Phantom / internal battery", "0.55 lb", "Cold-shoe mount"), - ("Sennheiser MKE Field 600 Shotgun", "Sennheiser", 329, 359, 4.7, 54, "Supercardioid", "40 Hz - 20 kHz", "XLR", "Phantom power", "0.6 lb", "Shock mount included"), - ("Shure MV7X Voice Broadcast Mic", "Shure", 179, 199, 4.6, 119, "Cardioid", "50 Hz - 16 kHz", "XLR", "Passive", "1.2 lb", "Desktop or boom mount"), - ("Rode PodMic USB Dynamic Mic", "Rode", 199, 219, 4.7, 82, "Cardioid", "20 Hz - 20 kHz", "USB-C, XLR", "USB bus / XLR", "2.0 lb", "Boom or desk mount"), - ("DJI Pocket Interview Mic", "DJI", 149, 169, 4.5, 39, "Cardioid", "50 Hz - 18 kHz", "USB-C", "Rechargeable", "0.2 lb", "Handheld interview kit"), - ("Sennheiser Profile USB Mic", "Sennheiser", 149, 169, 4.5, 61, "Cardioid", "20 Hz - 20 kHz", "USB-C", "USB bus power", "0.77 lb", "Desk stand included"), - ("Shure MoveMic Reporter Kit", "Shure", 269, 299, 4.4, 28, "Omnidirectional", "50 Hz - 18 kHz", "Bluetooth, USB-C", "Internal battery", "0.42 lb", "Mobile reporter kit"), - ("Rode Streamer Lavalier Twin", "Rode", 189, 209, 4.4, 31, "Omnidirectional", "20 Hz - 20 kHz", "USB-C adapter", "Plug-in power", "0.18 lb", "Dual clip-on set"), - ("Sennheiser Accent Podcast Pack", "Sennheiser", 399, 429, 4.6, 26, "Cardioid", "50 Hz - 16 kHz", "USB interface, XLR", "USB + phantom", "2.5 lb", "Interface plus mic bundle"), - ] - records = [] - for offset, entry in enumerate(entries): - name, brand, price, list_price, rating, review_count, pattern, response, connectivity, power, weight, bundle_note = entry - records.append( - make_product( - name=name, - brand=brand, - category_slug="microphones", - top_category_slug="audio", - product_type="Microphone", - short_description="Microphone or wireless capture kit with connectivity and monitoring data ready for compare and Q&A tasks.", - description=f"{name} mirrors an audio-focused B&H listing with demo-only purchasing, local pickup, and no real device activation flow.", - price=price, - list_price=list_price, - rating=rating, - review_count=review_count, - qa_count=6 + offset, - best_seller_rank=start_rank + offset, - sort_newness=120 - offset, - accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), - specs=audio_specs(pattern, response, connectivity, power, weight, bundle_note), - search_blob=f"{brand} microphone wireless usb xlr creator audio", - connectivity=connectivity, - availability="In Stock", - stock_level=11 - (offset % 4), - pickup_message="Ready at audio desks", - shipping_message="Free audio shipping", - release_label="Audio 2025", - featured=offset < 2, - deal_label="Audio Special", - ) - ) - return records - - -def headphone_products(start_rank): - entries = [ - ("Sennheiser HD 490 Pro Reference Headphones", "Sennheiser", 399, 429, 4.8, 68, "Open-back", "5 Hz - 36 kHz", "Wired 3.5mm / 1/4in", "Passive", "0.72 lb", "Reference mixing"), - ("Sony Studio MDR-M1 Headphones", "Sony", 249, 279, 4.6, 57, "Closed-back", "5 Hz - 80 kHz", "Wired 3.5mm / 1/4in", "Passive", "0.55 lb", "Recording and monitoring"), - ("Sennheiser HD 280 Broadcast Headphones", "Sennheiser", 99, 119, 4.5, 122, "Closed-back", "8 Hz - 25 kHz", "Wired 3.5mm / 1/4in", "Passive", "0.63 lb", "Tracking"), - ("Sony Monitor ZX Pro Headphones", "Sony", 129, 149, 4.4, 74, "Closed-back", "10 Hz - 40 kHz", "Wired 3.5mm", "Passive", "0.47 lb", "Creator desk monitoring"), - ("Sennheiser Accent BT Creator Headset", "Sennheiser", 229, 249, 4.3, 43, "Closed-back", "18 Hz - 22 kHz", "Bluetooth 5.3, USB-C", "Internal battery", "0.62 lb", "Portable editing"), - ("Sony OpenMix Spatial Headphones", "Sony", 299, 329, 4.5, 28, "Open-back", "8 Hz - 50 kHz", "Wired and USB-C DAC", "Passive", "0.59 lb", "Spatial reference"), - ("Sennheiser FieldFold On-Ear Headphones", "Sennheiser", 89, 99, 4.2, 31, "On-ear", "20 Hz - 20 kHz", "Wired 3.5mm", "Passive", "0.36 lb", "Compact field kit"), - ("Sony Creator ANC Monitor Headphones", "Sony", 349, 379, 4.6, 36, "Closed-back ANC", "10 Hz - 30 kHz", "Bluetooth 5.2, 3.5mm, USB-C", "Internal battery", "0.64 lb", "Travel and edit"), - ] - records = [] - for offset, entry in enumerate(entries): - name, brand, price, list_price, rating, review_count, pattern, response, connectivity, power, weight, bundle_note = entry - records.append( - make_product( - name=name, - brand=brand, - category_slug="headphones", - top_category_slug="audio", - product_type="Headphones", - short_description="Monitoring headphones with connection, isolation, and workflow notes suitable for side-by-side comparison tasks.", - description=f"{name} is a deterministic audio monitoring product in the local B&H mirror with pickup badges and no live warranty lookup.", - price=price, - list_price=list_price, - rating=rating, - review_count=review_count, - qa_count=3 + offset, - best_seller_rank=start_rank + offset, - sort_newness=105 - offset, - accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), - specs=audio_specs(pattern, response, connectivity, power, weight, bundle_note), - search_blob=f"{brand} headphones monitor {connectivity} studio", - connectivity=connectivity, - availability="In Stock", - stock_level=10, - pickup_message="Ready today", - shipping_message="Free shipping", - release_label="Monitoring 2025", - deal_label="Audio Special", - ) - ) - return records - - -def drone_products(start_rank): - entries = [ - ("DJI Airframe 4S Fly More Drone", "DJI", 1399, 1499, 4.8, 92, "1-inch CMOS", "5.4K60", "46 min", "Omnidirectional", "O4 transmission", "1.58 lb"), - ("DJI Neo Cinema Mini Drone", "DJI", 699, 749, 4.5, 81, "1/1.3-inch CMOS", "4K60 vertical", "31 min", "Forward / downward", "O4 Lite", "0.54 lb"), - ("DJI Inspire Mini Pro Drone", "DJI", 2199, 2399, 4.7, 49, "4/3 CMOS", "6K30", "38 min", "Omnidirectional", "O4 transmission", "2.4 lb"), - ("DJI Adventure FPV Combo", "DJI", 999, 1099, 4.4, 36, "1/1.7-inch CMOS", "4K120", "22 min", "Forward sensing", "Low-latency FPV", "1.7 lb"), - ("DJI Mini Air Travel Drone", "DJI", 499, 549, 4.4, 77, "1/1.3-inch CMOS", "4K30", "34 min", "Tri-directional", "O3 transmission", "0.55 lb"), - ("DJI Mavic Survey Drone", "DJI", 1899, 1999, 4.6, 28, "4/3 CMOS", "5.1K50", "43 min", "Omnidirectional", "O4 transmission", "2.0 lb"), - ("DJI Pocket FPV Neo", "DJI", 399, 449, 4.2, 24, "1/2-inch CMOS", "4K30", "18 min", "Downward", "FPV transmission", "0.46 lb"), - ("DJI Creator Airframe SE", "DJI", 849, 899, 4.5, 31, "1-inch CMOS", "4K60", "39 min", "Forward / backward", "O4 Lite", "0.95 lb"), - ] - records = [] - for offset, entry in enumerate(entries): - name, brand, price, list_price, rating, review_count, sensor, video, flight_time, avoidance, transmission, weight = entry - records.append( - make_product( - name=name, - brand=brand, - category_slug="drones", - top_category_slug="video", - product_type="Drone", - short_description="Aerial creator platform with flight time, sensing, and transmission rows designed for filter and comparison tasks.", - description=f"{name} is part of the local benchmark catalog and never connects to live flight services, geofencing, or registration systems.", - price=price, - list_price=list_price, - rating=rating, - review_count=review_count, - qa_count=7 + offset, - best_seller_rank=start_rank + offset, - sort_newness=92 - offset, - accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), - specs=drone_specs(sensor, video, flight_time, avoidance, transmission, weight), - search_blob=f"{brand} drone aerial {video} {sensor} creator", - connectivity=transmission, - availability="In Stock" if offset < 6 else "Limited Stock", - stock_level=4 if offset < 6 else 1, - pickup_message="Pickup by end of day", - shipping_message="Adult signature shipping", - release_label="Aerial 2025", - featured=offset < 2, - deal_label="Drone Event", - ) - ) - return records - - -def monitor_recorder_products(start_rank): - entries = [ - ("Atomos Ninja Creator Monitor 5", "Atomos", 699, 759, 4.7, 54, "5-inch 1000 nit touchscreen", "4K60 ProRes", "HDMI in/out, USB-C", "2.5-inch SSD or USB-C media", "0.8 lb"), - ("Atomos Shogun Studio 7 Monitor Recorder", "Atomos", 1199, 1299, 4.6, 32, "7-inch 2000 nit HDR", "6K30 / 4K120", "HDMI, 12G-SDI, USB-C", "SSD media", "1.9 lb"), - ("Sony Creator Field Monitor 5", "Sony", 499, 549, 4.5, 41, "5.5-inch daylight display", "4K30 monitoring", "HDMI, USB-C power", "microSD LUT import", "0.9 lb"), - ("Blackmagic Video Assist 12G 7", "Blackmagic", 995, 1045, 4.7, 36, "7-inch HDR touchscreen", "4K60 BRAW", "12G-SDI, HDMI, USB-C", "Dual SD UHS-II", "1.7 lb"), - ("Atomos Neon Mobile Director Monitor", "Atomos", 1499, 1599, 4.6, 18, "17-inch on-set display", "4K60 monitoring", "HDMI, 12G-SDI", "External media module", "7.9 lb"), - ("Blackmagic Pocket View 5 HDR Monitor", "Blackmagic", 429, 469, 4.4, 22, "5-inch HDR touch display", "4K monitoring", "HDMI, USB-C power", "LUTs via SD card", "0.7 lb"), - ] - records = [] - for offset, entry in enumerate(entries): - name, brand, price, list_price, rating, review_count, panel, recording, connectivity, media, weight = entry - records.append( - make_product( - name=name, - brand=brand, - category_slug="monitors-recorders", - top_category_slug="video", - product_type="Monitor/Recorder", - short_description="Field monitor or recorder with brightness, recording, and I/O data tailored for compare-heavy production tasks.", - description=f"{name} is mirrored as a local-only monitoring listing with no firmware downloads, live media activation, or external service calls.", - price=price, - list_price=list_price, - rating=rating, - review_count=review_count, - qa_count=5 + offset, - best_seller_rank=start_rank + offset, - sort_newness=88 - offset, - accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), - specs=monitor_specs(panel, recording, "LUT and waveform tools", "HDR-ready", connectivity, weight), - search_blob=f"{brand} monitor recorder field display {recording} {connectivity}", - connectivity=connectivity, - availability="In Stock", - stock_level=5, - pickup_message="Ready at pro video counters", - shipping_message="Protected display shipping", - release_label="Production Monitor 2025", - featured=offset < 2, - deal_label="Video Special", - ) - ) - return records - - -def laptop_products(start_rank): - entries = [ - ("Apple CreatorBook 14 M3 Pro Laptop", "Apple", 2399, 2499, 4.8, 87, "M3 Pro 12-core", "36GB unified memory", "1TB SSD", "14.2-inch 3024x1964 mini-LED", "Thunderbolt 4 x3, HDMI, SDXC", "Wi-Fi 6E, Bluetooth 5.3", "3.5 lb"), - ("Dell Precision Edge 16 Laptop", "Dell", 2699, 2849, 4.7, 63, "Intel Core Ultra 9", "32GB DDR5", "2TB SSD", "16-inch 3840x2400 OLED", "Thunderbolt 4 x2, HDMI, SD", "Wi-Fi 7, Bluetooth 5.4", "4.4 lb"), - ("ASUS ProArt Studio 13 OLED Laptop", "ASUS", 1899, 1999, 4.6, 58, "AMD Ryzen AI 9", "32GB LPDDR5X", "1TB SSD", "13.3-inch 2880x1800 OLED", "USB4, HDMI, USB-A, SD", "Wi-Fi 6E, Bluetooth 5.3", "3.3 lb"), - ("Apple CreatorBook 16 Max Laptop", "Apple", 3199, 3349, 4.9, 51, "M3 Max 16-core", "48GB unified memory", "1TB SSD", "16.2-inch 3456x2234 mini-LED", "Thunderbolt 4 x3, HDMI, SDXC", "Wi-Fi 6E, Bluetooth 5.3", "4.7 lb"), - ("Dell Mobile Color 14 Laptop", "Dell", 1599, 1699, 4.5, 44, "Intel Core Ultra 7", "16GB DDR5", "1TB SSD", "14-inch 2880x1800 OLED", "Thunderbolt 4 x2, HDMI", "Wi-Fi 6E, Bluetooth 5.3", "3.2 lb"), - ("ASUS ProArt Studio 16 Laptop", "ASUS", 2299, 2399, 4.7, 39, "AMD Ryzen 9", "32GB DDR5", "2TB SSD", "16-inch 3840x2400 OLED", "USB4, HDMI, USB-A, SD Express", "Wi-Fi 6E, Bluetooth 5.3", "4.5 lb"), - ("Apple CreatorBook Air 15 Laptop", "Apple", 1499, 1599, 4.6, 72, "M3 8-core", "24GB unified memory", "512GB SSD", "15.3-inch 2880x1864 Liquid Retina", "MagSafe, USB-C x2", "Wi-Fi 6E, Bluetooth 5.3", "3.3 lb"), - ("Dell Creator Compact 13 Laptop", "Dell", 1399, 1499, 4.4, 33, "Intel Core Ultra 5", "16GB LPDDR5", "512GB SSD", "13.4-inch 1920x1200 IPS", "USB-C x2, USB-A", "Wi-Fi 6E, Bluetooth 5.3", "2.9 lb"), - ] - records = [] - for offset, entry in enumerate(entries): - name, brand, price, list_price, rating, review_count, processor, memory, storage, display, ports, connectivity, weight = entry - records.append( - make_product( - name=name, - brand=brand, - category_slug="laptops", - top_category_slug="computers", - product_type="Laptop", - short_description="Creator laptop with performance, display, and port detail rows designed for real shopping-style filtering and compare tasks.", - description=f"{name} is a deterministic creator notebook listing with no live financing, warranty registration, or software activation.", - price=price, - list_price=list_price, - rating=rating, - review_count=review_count, - qa_count=5 + offset, - best_seller_rank=start_rank + offset, - sort_newness=80 - offset, - accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), - specs=computer_specs(processor, memory, storage, display, ports, connectivity, weight), - search_blob=f"{brand} laptop creator {processor} {memory} {storage} {display}", - capacity_gb=2048 if "2TB" in storage else (1024 if "1TB" in storage else 512), - connectivity=connectivity, - availability="In Stock", - stock_level=6, - pickup_message="Ready in 2 hours", - shipping_message="Free insured shipping", - release_label="Compute 2025", - featured=offset < 2, - deal_label="Creator Laptop Sale", - ) - ) - return records - - -def monitor_products(start_rank): - entries = [ - ("BenQ ColorPro 32 PD3225U Monitor", "BenQ", 1199, 1299, 4.8, 58, "31.5-inch", "3840x2160", "95% P3 / 99% Rec.709", "DisplayHDR 400", "Thunderbolt 4, HDMI, DP, USB-C", "18.5 lb"), - ("Dell UltraSharp 32 Thunderbolt Monitor", "Dell", 1399, 1499, 4.6, 43, "32-inch", "3840x2160", "98% DCI-P3", "DisplayHDR 600", "Thunderbolt 4, HDMI, DP, USB hub", "20.0 lb"), - ("Apple Studio Panel 27 Monitor", "Apple", 1599, 1599, 4.7, 64, "27-inch", "5120x2880", "P3 wide color", "600 nits", "Thunderbolt 3, USB-C x3", "13.9 lb"), - ("ASUS ProArt 27 PA279CRV Monitor", "ASUS", 499, 549, 4.5, 72, "27-inch", "3840x2160", "99% DCI-P3 / Adobe RGB", "HDR10", "USB-C, HDMI, DP, USB hub", "15.2 lb"), - ("BenQ SW272U Photo Monitor", "BenQ", 799, 879, 4.7, 37, "27-inch", "3840x2160", "99% Adobe RGB", "HDR10", "USB-C, HDMI, DP", "17.1 lb"), - ("Dell DualView 40 Creator Monitor", "Dell", 1699, 1799, 4.6, 28, "40-inch", "5120x2160", "98% DCI-P3", "DisplayHDR 600", "Thunderbolt 4, HDMI, DP, Ethernet", "31.0 lb"), - ("Apple Studio Panel Nano 27 Monitor", "Apple", 1899, 1899, 4.8, 25, "27-inch", "5120x2880", "P3 wide color", "600 nits", "Thunderbolt 3, USB-C x3", "14.1 lb"), - ("ASUS CreatorView 32 OLED Monitor", "ASUS", 1299, 1399, 4.6, 23, "31.5-inch", "3840x2160 OLED", "99% DCI-P3", "HDR10", "USB-C, HDMI, DP", "18.8 lb"), - ] - records = [] - for offset, entry in enumerate(entries): - name, brand, price, list_price, rating, review_count, size, resolution, color, hdr, inputs, weight = entry - condition = "Open-Box" if "SW272U" in name else "New" - records.append( - make_product( - name=name, - brand=brand, - category_slug="monitors", - top_category_slug="computers", - product_type="Monitor", - short_description="Creator display with clear panel, color, and input data for side-by-side compare workflows.", - description=f"{name} is mirrored with a spec-heavy retailer-style presentation for color, connectivity, and pickup benchmarking.", - price=price, - list_price=list_price, - rating=rating, - review_count=review_count, - qa_count=4 + offset, - best_seller_rank=start_rank + offset, - sort_newness=72 - offset, - accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), - specs=monitor_specs(size, resolution, color, hdr, inputs, weight), - search_blob=f"{brand} monitor color {resolution} {size} {inputs}", - connectivity=inputs, - availability="In Stock" if condition == "New" else "Limited Stock", - stock_level=5 if condition == "New" else 1, - pickup_message="Pickup available in select stores", - shipping_message="Oversize monitor shipping", - release_label="Display 2025", - condition=condition, - used_highlight=condition != "New", - deal_label="Open-Box" if condition != "New" else "Monitor Sale", - deal_type="open-box" if condition != "New" else "sale", - ) - ) - return records - - -def printer_products(start_rank): - entries = [ - ("Epson P900 Fine Art Photo Printer", "Epson", 1195, 1295, 4.7, 52, "13-inch sheets and roll media", "5760 x 1440 dpi", "1.5 min A3+", "UltraChrome PRO10", "USB, Ethernet, Wi-Fi", "35.7 lb"), - ("Canon ImagePRO ScanLite 400", "Canon", 699, 779, 4.4, 29, "A4 document and photo scanning", "4800 dpi", "4 sec per photo", "CIS scanner", "USB 3.0", "9.8 lb"), - ("Epson V850 Archival Photo Scanner", "Epson", 999, 1099, 4.7, 41, "Film and reflective originals", "6400 dpi", "1 min per 35mm strip", "Dual-lens CCD", "USB 2.0", "14.0 lb"), - ("Canon PIXStudio Pro 200 Printer", "Canon", 599, 649, 4.5, 38, "13-inch sheets", "4800 x 2400 dpi", "90 sec A3+", "Dye ink 8-color", "USB, Wi-Fi, Ethernet", "32.0 lb"), - ("Epson SureColor P700 Compact Printer", "Epson", 799, 869, 4.6, 34, "13-inch sheets and roll media", "5760 x 1440 dpi", "2 min A3+", "UltraChrome PRO10", "USB, Wi-Fi, Ethernet", "28.0 lb"), - ("Canon ScanGear Film 900", "Canon", 349, 399, 4.3, 19, "Film and photo scanning", "4800 dpi", "35 sec 35mm frame", "CIS scanner", "USB-C", "7.1 lb"), - ("Epson EcoProof Label Printer", "Epson", 249, 279, 4.2, 24, "Shipping and asset labels", "600 dpi", "4 ips", "Pigment ink", "USB, Ethernet", "11.3 lb"), - ("Canon DocumentFlow D120 Scanner", "Canon", 429, 479, 4.4, 21, "A4 office scanning", "600 dpi", "45 ppm", "CIS scanner", "USB 3.0", "8.2 lb"), - ] - records = [] - for offset, entry in enumerate(entries): - name, brand, price, list_price, rating, review_count, media, resolution, speed, ink, connectivity, weight = entry - product_type = "Scanner" if "Scanner" in name or "Scan" in name else "Printer" - records.append( - make_product( - name=name, - brand=brand, - category_slug="printers-scanners", - top_category_slug="computers", - product_type=product_type, - short_description="Output or scanning hardware with media, resolution, and workflow spec rows for benchmark product tasks.", - description=f"{name} mirrors a pro output listing with deterministic shipping, stock, and support flows inside the local benchmark environment.", - price=price, - list_price=list_price, - rating=rating, - review_count=review_count, - qa_count=3 + offset, - best_seller_rank=start_rank + offset, - sort_newness=64 - offset, - accent_color=next(color for b, _origin, color, _blurb in BRAND_DEFS if b == brand), - specs=printer_specs(media, resolution, speed, ink, connectivity, weight), - search_blob=f"{brand} printer scanner photo output {media}", - connectivity=connectivity, - availability="In Stock", - stock_level=3 + (offset % 3), - pickup_message="Pickup at print workflow counters", - shipping_message="Freight-safe shipping", - release_label="Output 2025", - deal_label="Print Studio Sale", - ) - ) - return records - - -def build_products(): - products = [] - products.extend(mirrorless_products()) - products.extend(dslr_products(len(products) + 1)) - products.extend(lens_products(len(products) + 1)) - products.extend(cinema_products(len(products) + 1)) - products.extend(support_products(len(products) + 1)) - products.extend(storage_products(len(products) + 1)) - products.extend(lighting_products(len(products) + 1)) - products.extend(microphone_products(len(products) + 1)) - products.extend(headphone_products(len(products) + 1)) - products.extend(drone_products(len(products) + 1)) - products.extend(monitor_recorder_products(len(products) + 1)) - products.extend(laptop_products(len(products) + 1)) - products.extend(monitor_products(len(products) + 1)) - products.extend(printer_products(len(products) + 1)) - return products - - -def create_reviews(product, ProductReview): - templates = [ - ("Reliable for paid work", "Used this on three recent shoots and the deterministic B&H mirror details lined up perfectly with the specs and pickup messaging."), - ("Great balance of value and features", "The spec presentation makes it easy to compare against similar options without the page hiding the important workflow details."), - ("Solid creator workflow fit", "Shipping notes, accessories, and compatibility sections felt like a real retailer experience while staying fully local and synthetic."), - ] - reviews = [] - desired = 2 if product.best_seller_rank <= 40 else 1 - for index in range(desired): - headline, body = templates[(product.id + index) % len(templates)] - reviews.append( - ProductReview( - product_id=product.id, - author_name=["Alex M.", "Jordan P.", "Samira L.", "Miles C."][(product.id + index) % 4], - headline=headline, - body=f"{body} {product.name} handled as expected in this demo environment.", - rating=5 if index == 0 or product.rating >= 4.7 else 4, - verified_purchase=True, - created_at=MIRROR_REFERENCE_DATE - timedelta(days=(product.id + index) % 120), - ) - ) - return reviews - - -def create_questions(product, ProductQuestion, ProductAnswer): - prompts = [ - ("Does this include a charger or power supply in the box?", "Yes. The demo listing includes the default power accessories noted in the spec and package section."), - ("Is local store pickup supported for this item?", "Pickup is available anywhere the store inventory block shows stock. This mirror uses deterministic synthetic availability."), - ("Will this work for a hybrid photo and video workflow?", "It is positioned for hybrid creator use in the local mirror and the technical specs reflect that workflow emphasis."), - ("Does this ship with cables or core accessories?", "Yes. Included accessories are listed in the spec groups and remain stable for benchmark tasks."), - ] - qa_pairs = [] - count = 2 if product.best_seller_rank <= 60 else 1 - for index in range(count): - question_text, answer_text = prompts[(product.id + index) % len(prompts)] - question = ProductQuestion( - product_id=product.id, - question=question_text, - asker_name=["Priya", "Ethan", "Nina", "Oscar"][(product.id + index) % 4], - created_at=MIRROR_REFERENCE_DATE - timedelta(days=(product.id + index) % 90), - ) - qa_pairs.append((question, answer_text)) - return qa_pairs - - -def bundle_definitions(): - return [ - ("Sony Hybrid Creator Kit", ["sony-aurora-a7x-mirrorless-camera", "sigma-artline-24-70mm-f-2-8-dg-dn-lens", "sandisk-pro-cinema-cfexpress-type-b-512gb-card"], 3499, 3796, "Featured", "Photo/video hybrid creators"), - ("Canon Wedding Coverage Bundle", ["canon-orbit-r6-mark-ii-mirrorless-camera", "canon-rf-24-105mm-f-4l-is-lens", "peak-design-everyday-sling-10l"], 3449, 3667, "Bundle", "Event photographers"), - ("Nikon Long Zoom Field Kit", ["nikon-zenith-z8-mirrorless-camera", "nikon-z-70-200mm-f-2-8-vr-s-lens", "manfrotto-carbon-travel-tripod-pro"], 6099, 6291, "Bundle", "Sports and wildlife"), - ("Fujifilm Street Story Pack", ["fujifilm-northlight-x-t5-mirrorless-camera", "fujifilm-xf-33mm-f-1-4-r-lm-lens", "peak-design-everyday-sling-10l"], 2499, 2647, "Bundle", "Travel creators"), - ("Panasonic Video Starter Rig", ["panasonic-lumix-s5-ii-mirrorless-camera", "panasonic-lumix-24-105mm-f-4-macro-lens", "atomos-ninja-creator-monitor-5"], 3299, 3465, "Bundle", "Hybrid capture"), - ("Blackmagic Documentary Rig", ["blackmagic-scout-6k-pro-cinema-camera", "sigma-sports-150-600mm-f-5-6-3-dg-dn-lens", "sandisk-rugged-studio-ssd-4tb"], 4099, 4293, "Featured", "Documentary teams"), - ("Audio Creator Desk Pack", ["shure-mvx2-usb-stream-mic", "sennheiser-hd-490-pro-reference-headphones", "dell-mobile-color-14-laptop"], 2049, 2177, "Bundle", "Podcast desks"), - ("DJI Travel Interview Kit", ["dji-mic-air-2tx-kit", "dji-neo-cinema-mini-drone", "sandisk-extreme-portable-ssd-2tb"], 1199, 1297, "Bundle", "Travel storytellers"), - ("Aputure Lighting Interview Pack", ["aputure-storm-300x-bi-color-led", "aputure-fresnel-2x-modifier", "manfrotto-nano-light-stand-duo"], 1169, 1247, "Bundle", "Single-subject lighting"), - ("Color Grade Suite", ["benq-colorpro-32-pd3225u-monitor", "apple-creatorbook-14-m3-pro-laptop", "sandisk-rugged-studio-ssd-4tb"], 3949, 4097, "Featured", "Editors and colorists"), - ("Field Audio Capture Pack", ["rode-wireless-creator-duo", "sennheiser-profile-usb-mic", "sony-creator-anc-monitor-headphones"], 699, 817, "Bundle", "Mobile interviews"), - ("Photo Archiving Workflow", ["epson-v850-archival-photo-scanner", "epson-p900-fine-art-photo-printer", "lexar-workflow-dock-4-bay"], 2199, 2333, "Bundle", "Archive and print"), - ("Compact Production Monitor Kit", ["atomos-ninja-creator-monitor-5", "sony-fx30-studio-cinema-camera", "sandisk-pro-cinema-cfexpress-type-b-512gb-card"], 2399, 2526, "Bundle", "Video crews"), - ("Drone Survey Pack", ["dji-mavic-survey-drone", "sandisk-creator-microsd-512gb-card", "apple-creatorbook-air-15-laptop"], 3299, 3497, "Bundle", "Aerial mapping"), - ("Travel Vlog Essentials", ["canon-orbit-r50-v-mirrorless-camera", "dji-pocket-interview-mic", "benro-slim-photo-tripod-kit"], 1189, 1247, "Bundle", "One-person crews"), - ("Studio Monitor Match Set", ["dell-ultrasharp-32-thunderbolt-monitor", "asus-proart-27-pa279crv-monitor", "apple-studio-panel-27-monitor"], 3299, 3497, "Bundle", "Multi-monitor suites"), - ("Creator Laptop Pair", ["apple-creatorbook-14-m3-pro-laptop", "asus-proart-studio-13-oled-laptop"], 4049, 4298, "Bundle", "Capture and edit duo"), - ("Wedding Dual Body Set", ["canon-orbit-r6-mark-ii-mirrorless-camera", "nikon-zenith-zf-mirrorless-camera", "lexar-gold-sdxc-256gb-v90-card"], 4499, 4694, "Bundle", "Two body coverage"), - ("Podcast Launch Bundle", ["shure-mv7x-voice-broadcast-mic", "sennheiser-accent-podcast-pack", "dell-creator-compact-13-laptop"], 1899, 1987, "Bundle", "New podcast launches"), - ("RGB Practical Lighting Set", ["godox-tubeflow-rgb-pair", "aputure-mc-pro-pocket-rgb-light", "peak-design-mobile-creator-stand"], 499, 557, "Bundle", "On-location accents"), - ] - - -def ensure_visual_assets(base_dir: str, products, bundles): - ensure_misc_assets(base_dir) - images_root = Path(base_dir) / "static" / "images" - products_root = images_root / "products" - bundles_root = images_root / "bundles" - for product in products: - image_path = products_root / f"{product['slug']}.svg" - ensure_svg(image_path, product["brand"], product["name"], product["accent_color"], product["product_type"]) - product["image_path"] = f"images/products/{product['slug']}.svg" - for bundle in bundles: - ensure_svg( - bundles_root / f"{bundle['slug']}.svg", - bundle["title"], - bundle["audience"], - "#24423f", - "Monitor", - ) - bundle["image_path"] = f"images/bundles/{bundle['slug']}.svg" +def slugify(text: str) -> str: + text = re.sub(r"[^a-z0-9]+", "-", (text or "").lower()) + return re.sub(r"-{2,}", "-", text).strip("-")[:200] + + +def digest(*parts: object) -> int: + """Stable integer derived from the given parts, for benchmark-state choices.""" + joined = "|".join(str(part) for part in parts) + return int(hashlib.sha256(joined.encode("utf-8")).hexdigest()[:12], 16) + + +def pick(options: list, *parts: object): + return options[digest(*parts) % len(options)] + + +def deterministic_password_hash(password: str, salt_seed: str) -> str: + """PBKDF2 hash with a derived, fixed salt, in Werkzeug's storage format. + + Flask-Bcrypt salts randomly, which made the shipped seed impossible to + regenerate byte for byte from source. Benchmark accounts therefore use a + salt derived from the account itself; live registrations still use bcrypt. + """ + iterations = 260000 + salt = hashlib.sha256(f"bh_photo:{salt_seed}".encode("utf-8")).hexdigest()[:16] + derived = hashlib.pbkdf2_hmac("sha256", password.encode("utf-8"), salt.encode("utf-8"), iterations) + return f"pbkdf2:sha256:{iterations}${salt}${derived.hex()}" + + +def load_manifest(base_dir: str) -> dict: + path = Path(base_dir) / MANIFEST_NAME + if not path.is_file(): + raise RuntimeError(f"missing source manifest: {path}") + return json.loads(path.read_text(encoding="utf-8")) + + +def focal_bucket(focal_length: str | None) -> str: + """Group a published focal length so the listing facet has usable buckets.""" + if not focal_length: + return "" + numbers = [float(n) for n in re.findall(r"(\d+(?:\.\d+)?)\s*mm", focal_length)] + if not numbers: + return "" + widest = min(numbers) + if widest < 24: + return "Ultra Wide" + if widest < 45: + return "Wide" + if widest < 85: + return "Standard" + return "Telephoto" + + +def search_blob(product: dict) -> str: + """Text the site's search matches against, built only from sourced fields.""" + parts = [product["name"], product["brand"], product["product_type"], + product.get("mpn") or "", product.get("bh_sku") or "", + product.get("mount_type") or "", product.get("sensor_size") or "", + product.get("focal_length") or "", product.get("connectivity") or ""] + parts += [f"{row['label']} {row['value']}" for row in product["specs"][:12]] + return " ".join(part for part in parts if part)[:2000] + + +def short_description(product: dict) -> str: + text = (product.get("description") or "").strip() + if not text: + return f"{product['brand']} {product['product_type'].lower()} listed in the B&H catalog." + sentence = re.split(r"(?<=[.!?])\s", text)[0] + return sentence[:210] + + +def benchmark_condition(product: dict, index: int) -> tuple[str, float | None]: + """Assign the used / open-box shelf. + + B&H used stock turns over constantly and is not meaningfully archivable, so + condition here is declared benchmark state derived from the SKU, applied on + top of real products. The price discount is generated, not sourced. + """ + sourced = product.get("condition") or "New" + if sourced != "New": + return sourced, None + bucket = digest("condition", product["bh_sku"] or product["slug"]) % 12 + price = product.get("price_usd") + if bucket == 0 and price: + return "Used", round(price * 0.72, 2) + if bucket == 1 and price: + return "Open-Box", round(price * 0.86, 2) + return "New", None def seed_database(db, models, base_dir: str): @@ -1218,7 +179,6 @@ def seed_database(db, models, base_dir: str): ProductImage = models["ProductImage"] ProductSpecGroup = models["ProductSpecGroup"] ProductSpec = models["ProductSpec"] - ProductVariant = models["ProductVariant"] ProductReview = models["ProductReview"] ProductQuestion = models["ProductQuestion"] ProductAnswer = models["ProductAnswer"] @@ -1228,200 +188,208 @@ def seed_database(db, models, base_dir: str): StoreInventory = models["StoreInventory"] Deal = models["Deal"] + manifest = load_manifest(base_dir) + departments = manifest["departments"] + subcategory_names = manifest["subcategory_names"] + category_by_slug = {} - for item in CATEGORY_DEFS: + for slug, spec in sorted(departments.items(), key=lambda item: item[1]["nav_order"]): category = Category( - name=item["name"], - slug=item["slug"], - description=item.get("description", ""), - hero_copy=item.get("hero_copy", item.get("description", "")), - icon_label=item.get("icon_label", item["name"][:4]), - nav_order=item.get("nav_order", 99), + name=spec["name"], slug=slug, + description=f"{spec['name']} gear carried by B&H.", + hero_copy=f"Shop {spec['name']} at B&H.", + icon_label=spec["name"][:4], nav_order=spec["nav_order"], ) db.session.add(category) - category_by_slug[item["slug"]] = category + category_by_slug[slug] = category + db.session.flush() + + order = 1 + for slug, spec in sorted(departments.items(), key=lambda item: item[1]["nav_order"]): + for child in spec["children"]: + if child == slug: + # a department with a single same-named shelf (Drones) keeps one row + continue + category = Category( + name=subcategory_names[child], slug=child, + description=f"{subcategory_names[child]} in the {spec['name']} department.", + hero_copy=f"{subcategory_names[child]} at B&H.", + icon_label=subcategory_names[child][:4], + nav_order=order, parent_id=category_by_slug[slug].id, + ) + db.session.add(category) + category_by_slug[child] = category + order += 1 db.session.flush() - for item in CATEGORY_DEFS: - if item.get("parent"): - category_by_slug[item["slug"]].parent_id = category_by_slug[item["parent"]].id brand_by_name = {} - for name, origin, color, blurb in BRAND_DEFS: - brand = Brand(name=name, slug=slugify(name), origin=origin, badge_color=color, blurb=blurb) + for name in sorted({product["brand"] for product in manifest["products"]}): + brand = Brand( + name=name, slug=slugify(name), + origin="", badge_color=f"#{digest('brand', name) % 0xFFFFFF:06x}", + blurb=f"{name} products carried by B&H.", + ) db.session.add(brand) brand_by_name[name] = brand db.session.flush() - product_blueprints = build_products() - bundle_blueprints = [ - {"title": title, "slug": slugify(title), "items": items, "bundle_price": bundle_price, "list_price": list_price, "badge": badge, "audience": audience} - for title, items, bundle_price, list_price, badge, audience in bundle_definitions() - ] - ensure_visual_assets(base_dir, product_blueprints, bundle_blueprints) + store = StoreLocation(**STORE) + db.session.add(store) + db.session.flush() + + created = [] + for index, entry in enumerate(manifest["products"]): + condition, adjusted_price = benchmark_condition(entry, index) + sourced_price = entry.get("price_usd") + price = adjusted_price if adjusted_price is not None else sourced_price + list_price = sourced_price if adjusted_price is not None else None + seed_key = entry.get("bh_sku") or entry["slug"] - products_by_slug = {} - created_products = [] - for blueprint in product_blueprints: product = Product( - category_id=category_by_slug[blueprint["category_slug"]].id, - brand_id=brand_by_name[blueprint["brand"]].id, - name=blueprint["name"], - slug=blueprint["slug"], - sku=blueprint["sku"], - short_description=blueprint["short_description"], - description=blueprint["description"], - search_blob=blueprint["search_blob"], - price=blueprint["price"], - list_price=blueprint["list_price"], - rating=blueprint["rating"], - review_count=blueprint["review_count"], - qa_count=blueprint["qa_count"], - condition=blueprint["condition"], - availability=blueprint["availability"], - stock_level=blueprint["stock_level"], - pickup_available=blueprint["pickup_available"], - pickup_message=blueprint["pickup_message"], - shipping_message=blueprint["shipping_message"], - return_window=blueprint["return_window"], - warranty=blueprint["warranty"], - best_seller_rank=blueprint["best_seller_rank"], - sort_newness=blueprint["sort_newness"], - top_category_slug=blueprint["top_category_slug"], - subcategory_slug=blueprint["subcategory_slug"], - product_family=blueprint["product_family"], - product_type=blueprint["product_type"], - sensor_size=blueprint["sensor_size"], - mount_type=blueprint["mount_type"], - focal_length=blueprint["focal_length"], - focal_length_bucket=blueprint["focal_length_bucket"], - megapixels=blueprint["megapixels"], - capacity_gb=blueprint["capacity_gb"], - connectivity=blueprint["connectivity"], - image_path=blueprint["image_path"], - accent_color=blueprint["accent_color"], - release_label=blueprint["release_label"], - is_featured=blueprint["featured"], - is_bundle_anchor=blueprint["bundle_anchor"], - is_used_highlight=blueprint["used_highlight"], + category_id=category_by_slug[entry["subcategory_slug"]].id, + brand_id=brand_by_name[entry["brand"]].id, + name=entry["name"], slug=entry["slug"], + sku=entry.get("bh_sku") or f"BH{index:05d}", + short_description=short_description(entry), + description=entry.get("description") or "", + search_blob=search_blob(entry), + price=price if price is not None else 0.0, + list_price=list_price, + rating=0.0, review_count=0, qa_count=0, # set from the rows actually created + condition=condition, + availability=entry.get("availability") or "In Stock", + stock_level=4 + digest("stock", seed_key) % 18, + pickup_available=digest("pickup", seed_key) % 4 != 0, + pickup_message="Ready in 2 hours", + shipping_message="Free Expedited Shipping", + return_window="30-Day Return Window", + warranty="Manufacturer warranty as stated by B&H", + best_seller_rank=index + 1, + sort_newness=len(manifest["products"]) - index, + top_category_slug=entry["department_slug"], + subcategory_slug=entry["subcategory_slug"], + product_family=entry["subcategory_slug"], + product_type=entry["product_type"], + sensor_size=entry.get("sensor_size") or "", + mount_type=entry.get("mount_type") or "", + focal_length=entry.get("focal_length") or "", + focal_length_bucket=focal_bucket(entry.get("focal_length")), + megapixels=entry.get("megapixels") or 0, + capacity_gb=entry.get("capacity_gb") or 0, + connectivity=entry.get("connectivity") or "", + pickup_store_count=1, + # products whose photo the archive does not hold fall back to a + # placeholder committed to the repo, so the page never shows a broken + # image and the gap stays visible to a reviewer + image_path=entry.get("image_path") or "icons/product-placeholder.svg", + accent_color=f"#{digest('accent', seed_key) % 0xFFFFFF:06x}", + release_label="", + is_featured=index % 9 == 0, + is_bundle_anchor=index % 11 == 0, + is_used_highlight=condition != "New", ) db.session.add(product) - db.session.flush() - products_by_slug[product.slug] = product - created_products.append((product, blueprint)) - - for order, label in enumerate(["Primary", "Detail", "Kit View"]): - db.session.add(ProductImage(product_id=product.id, path=product.image_path, label=label, sort_order=order)) - - for group_order, group in enumerate(blueprint["specs"]): - spec_group = ProductSpecGroup(product_id=product.id, title=group["title"], sort_order=group_order) - db.session.add(spec_group) - db.session.flush() - for spec_order, (spec_name, spec_value) in enumerate(group["rows"]): - db.session.add( - ProductSpec( - group_id=spec_group.id, - name=spec_name, - value=spec_value, - sort_order=spec_order, - ) - ) - - for order, variant in enumerate(blueprint["variants"]): - label, variant_type, value, delta = variant - db.session.add( - ProductVariant( - product_id=product.id, - label=label, - variant_type=variant_type, - value=value, - price_delta=delta, - ) - ) + created.append((product, entry)) + db.session.flush() - if blueprint["deal_label"]: - db.session.add( - Deal( - product_id=product.id, - label=blueprint["deal_label"], - sale_price=blueprint["price"], - deal_type=blueprint["deal_type"], - is_active=True, - ) + for product, entry in created: + if entry.get("image_path"): + db.session.add(ProductImage(product_id=product.id, path=entry["image_path"], + label=f"{product.name} main image", sort_order=0)) + + groups = {} + for row in entry["specs"]: + title = row["group"] or "Specifications" + if title not in groups: + group = ProductSpecGroup(product_id=product.id, title=title, sort_order=len(groups)) + db.session.add(group) + db.session.flush() + groups[title] = (group, 0) + group, position = groups[title] + db.session.add(ProductSpec(group_id=group.id, name=row["label"], + value=row["value"], sort_order=position)) + groups[title] = (group, position + 1) + + seed_key = entry.get("bh_sku") or entry["slug"] + review_total = 1 + digest("reviews", seed_key) % 4 + ratings = [] + for number in range(review_total): + rating = 3 + digest("rating", seed_key, number) % 3 + ratings.append(rating) + db.session.add(ProductReview( + product_id=product.id, + author_name=pick(REVIEW_AUTHORS, "author", seed_key, number), + headline=pick(REVIEW_HEADLINES, "headline", seed_key, number), + body=(f"Benchmark review text for {product.name}. This mirror generates " + f"review copy; it is not taken from B&H."), + rating=rating, verified_purchase=digest("verified", seed_key, number) % 3 != 0, + created_at=MIRROR_REFERENCE_DATE - timedelta(days=30 + number * 17), + )) + # the badge must equal the rows a shopper can actually open + product.review_count = review_total + product.rating = round(sum(ratings) / len(ratings), 1) + + question_total = 1 + digest("questions", seed_key) % 3 + for number in range(question_total): + question = ProductQuestion( + product_id=product.id, + question=pick(QUESTION_TEMPLATES, "question", seed_key, number), + asker_name=pick(REVIEW_AUTHORS, "asker", seed_key, number), + created_at=MIRROR_REFERENCE_DATE - timedelta(days=20 + number * 9), ) + db.session.add(question) + db.session.flush() + db.session.add(ProductAnswer( + question_id=question.id, responder_name="B&H Demo Support", + answer=pick(ANSWER_TEMPLATES, "answer", seed_key, number), + created_at=question.created_at + timedelta(days=1), + )) + product.qa_count = question_total + + if product.pickup_available: + db.session.add(StoreInventory( + store_id=store.id, product_id=product.id, + quantity=1 + digest("counter", seed_key) % 6, + pickup_eta="Ready in 2 hours", + )) + + if product.list_price and product.price and product.list_price > product.price: + db.session.add(Deal( + product_id=product.id, + label="Open-Box Savings" if product.condition == "Open-Box" else "Used Savings", + sale_price=product.price, deal_type="condition", is_active=True, + )) - stores = [] - for name, slug, city, state, address, hours, phone, note in STORE_DEFS: - store = StoreLocation( - name=name, - slug=slug, - city=city, - state=state, - address=address, - pickup_hours=hours, - contact_phone=phone, - inventory_note=note, - ) - db.session.add(store) - stores.append(store) db.session.flush() - for product, blueprint in created_products: - store_count = 0 - for store_index, store in enumerate(stores): - seed = sum(ord(char) for char in f"{product.slug}{store.slug}") - quantity = 0 - if product.pickup_available and product.availability != "Pre-Order": - quantity = seed % 6 - if product.condition != "New": - quantity = min(quantity, 2) - pickup_eta = "Ready in 2 hours" if quantity >= 3 else "Ready tomorrow after 11:00" - db.session.add( - StoreInventory( - store_id=store.id, - product_id=product.id, - quantity=quantity, - pickup_eta=pickup_eta, - ) + # Bundles group real products that share a department. The grouping, the + # bundle names and the bundle price are benchmark state, not B&H offers. + by_department = {} + for product, entry in created: + by_department.setdefault(entry["department_slug"], []).append(product) + for department, members in sorted(by_department.items()): + members = sorted(members, key=lambda item: item.id) + for number in range(min(3, len(members) // 3)): + chosen = members[number * 3:number * 3 + 3] + if len(chosen) < 3: + break + total = sum(item.price for item in chosen) + if total <= 0: + continue + title = f"{chosen[0].name.split()[0]} {department.replace('-', ' ').title()} Kit {number + 1}" + bundle = Bundle( + title=title, slug=slugify(title), + description=("Benchmark bundle: these items are grouped by this mirror for " + "multi-item checkout tasks. B&H does not sell this combination."), + image_path=chosen[0].image_path, + bundle_price=round(total * 0.93, 2), list_price=round(total, 2), + badge="Benchmark bundle", audience=department.replace("-", " ").title(), + featured=number == 0, ) - if quantity > 0: - store_count += 1 - product.pickup_store_count = store_count - - review_rows = [] - question_rows = [] - answer_rows = [] - for product, _blueprint in created_products: - review_rows.extend(create_reviews(product, ProductReview)) - for question, answer_text in create_questions(product, ProductQuestion, ProductAnswer): - db.session.add(question) + db.session.add(bundle) db.session.flush() - answer_rows.append( - ProductAnswer( - question_id=question.id, - responder_name=["B&H Demo Team", "Store Specialist", "Workflow Advisor"][question.id % 3], - answer=answer_text, - created_at=question.created_at + timedelta(hours=12), - ) - ) - db.session.add_all(review_rows) - db.session.add_all(answer_rows) - - for bundle_blueprint in bundle_blueprints: - bundle = Bundle( - title=bundle_blueprint["title"], - slug=bundle_blueprint["slug"], - description=f"{bundle_blueprint['title']} collects compatible items into a deterministic checkout-ready package for benchmark tasks.", - image_path=bundle_blueprint["image_path"], - bundle_price=bundle_blueprint["bundle_price"], - list_price=bundle_blueprint["list_price"], - badge=bundle_blueprint["badge"], - audience=bundle_blueprint["audience"], - featured=bundle_blueprint["badge"] == "Featured", - ) - db.session.add(bundle) - db.session.flush() - for item_slug in bundle_blueprint["items"]: - db.session.add(BundleItem(bundle_id=bundle.id, product_id=products_by_slug[item_slug].id, quantity=1)) + for item in chosen: + db.session.add(BundleItem(bundle_id=bundle.id, product_id=item.id, quantity=1)) db.session.commit() @@ -1441,135 +409,123 @@ def seed_benchmark_users(db, models): StoreLocation = models["StoreLocation"] Product = models["Product"] - stores = StoreLocation.query.order_by(StoreLocation.id).all() - products = {product.slug: product for product in Product.query.all()} - created_users = [] + store = StoreLocation.query.order_by(StoreLocation.id).first() + products = Product.query.order_by(Product.id).all() + if not products: + return - for index, user_data in enumerate(USER_DEFS): + # Each account is anchored on one department so its saved state is coherent. + departments = sorted({product.top_category_slug for product in products}) + created_users = [] + for index, entry in enumerate(USER_DEFS): user = User( - email=user_data["email"], - username=user_data["username"], - display_name=user_data["display_name"], - phone=f"(555) 200-01{index + 1:02d}", - company=user_data["company"], - role=user_data["role"], - preferred_store_id=stores[index % len(stores)].id, - newsletter_opt_in=index % 2 == 0, - sms_opt_in=index in (1, 3), + email=entry["email"], username=entry["username"], display_name=entry["display_name"], + phone=f"(555) 200-01{index + 1:02d}", company=entry["company"], role=entry["role"], + preferred_store_id=store.id if store else None, + newsletter_opt_in=index % 2 == 0, sms_opt_in=index in (1, 3), created_at=MIRROR_REFERENCE_DATE - timedelta(days=120 - index * 11), ) - user.set_password(BENCHMARK_PASSWORD) + user.password_hash = deterministic_password_hash(BENCHMARK_PASSWORD, entry["email"]) db.session.add(user) db.session.flush() created_users.append(user) - db.session.add( - Address( - user_id=user.id, - label="Studio", - recipient=user.display_name, - line1=f"{100 + index * 11} Benchmark Ave", - city=["New York", "Brooklyn", "Austin", "Los Angeles"][index], - state=["NY", "NY", "TX", "CA"][index], - zip_code=["10001", "11217", "78701", "90013"][index], - phone=user.phone, - is_default=True, - ) - ) - + db.session.add(Address( + user_id=user.id, label="Studio", recipient=user.display_name, + line1=f"{100 + index * 11} Benchmark Ave", + city=["New York", "Brooklyn", "Austin", "Los Angeles"][index], + state=["NY", "NY", "TX", "CA"][index], + zip_code=["10001", "11217", "78701", "90013"][index], + phone=user.phone, is_default=True, + )) db.session.flush() - alice, bob, carol, david = created_users - wishlist_map = { - alice.id: ["benq-colorpro-32-pd3225u-monitor", "fujifilm-northlight-x-t5-mirrorless-camera", "aputure-storm-300x-bi-color-led", "sandisk-rugged-studio-ssd-4tb"], - bob.id: ["blackmagic-scout-6k-pro-cinema-camera", "dji-airframe-4s-fly-more-drone", "atomos-ninja-creator-monitor-5", "rode-wireless-creator-duo"], - carol.id: ["shure-mvx2-usb-stream-mic", "sennheiser-hd-490-pro-reference-headphones", "apple-creatorbook-air-15-laptop"], - david.id: ["apple-creatorbook-14-m3-pro-laptop", "benq-sw272u-photo-monitor", "epson-p900-fine-art-photo-printer"], - } - compare_map = { - alice.id: ["sony-aurora-a7x-mirrorless-camera", "canon-orbit-r6-mark-ii-mirrorless-camera", "fujifilm-northlight-x-t5-mirrorless-camera"], - bob.id: ["blackmagic-scout-6k-pro-cinema-camera", "sony-fx30-studio-cinema-camera", "canon-c70-motion-cinema-camera"], - carol.id: ["rode-wireless-creator-duo", "dji-mic-air-2tx-kit", "shure-mvx2-usb-stream-mic"], - david.id: ["apple-creatorbook-14-m3-pro-laptop", "dell-precision-edge-16-laptop", "asus-proart-studio-13-oled-laptop"], - } - cart_map = { - alice.id: [("sony-aurora-a7x-mirrorless-camera", 1), ("sigma-artline-24-70mm-f-2-8-dg-dn-lens", 1)], - bob.id: [("blackmagic-scout-6k-pro-cinema-camera", 1), ("atomos-ninja-creator-monitor-5", 1), ("sandisk-pro-cinema-cfexpress-type-b-512gb-card", 2)], - carol.id: [("shure-mvx2-usb-stream-mic", 1), ("sennheiser-profile-usb-mic", 1)], - david.id: [("benq-colorpro-32-pd3225u-monitor", 1), ("sandisk-rugged-studio-ssd-4tb", 1)], - } - reservation_map = { - alice.id: ("fujifilm-northlight-x-t5-mirrorless-camera", stores[0].id), - bob.id: ("blackmagic-scout-6k-pro-cinema-camera", stores[4].id), - carol.id: ("rode-wireless-creator-duo", stores[1].id), - david.id: ("benq-colorpro-32-pd3225u-monitor", stores[5].id), - } - - for user_id, slugs in wishlist_map.items(): - for slug in slugs: - db.session.add(WishlistItem(user_id=user_id, product_id=products[slug].id, created_at=MIRROR_REFERENCE_DATE - timedelta(days=(products[slug].id % 40)))) - for user_id, slugs in compare_map.items(): - for slug in slugs: - db.session.add(CompareItem(user_id=user_id, product_id=products[slug].id, created_at=MIRROR_REFERENCE_DATE - timedelta(days=(products[slug].id % 25)))) - for user_id, entries in cart_map.items(): - for slug, quantity in entries: - db.session.add(CartItem(user_id=user_id, product_id=products[slug].id, quantity=quantity, added_at=MIRROR_REFERENCE_DATE - timedelta(days=(products[slug].id % 10)))) - for user_id, (slug, store_id) in reservation_map.items(): - db.session.add( - StoreReservation( - user_id=user_id, - store_id=store_id, - product_id=products[slug].id, - quantity=1, - status="Reserved", - pickup_window="Ready tomorrow after 11:00", - created_at=MIRROR_REFERENCE_DATE - timedelta(days=3 + (products[slug].id % 4)), - ) - ) - - order_defs = [ - (alice, "BH-20260402-0101", "Delivered", "Ship to address", ["canon-orbit-r6-mark-ii-mirrorless-camera", "canon-rf-24-105mm-f-4l-is-lens"], 18.50, 221.73, "Delivered to Brooklyn studio"), - (alice, "BH-20260314-0102", "Delivered", "Store pickup", ["peak-design-everyday-sling-10l"], 0.00, 13.22, "Picked up at NYC SuperStore"), - (bob, "BH-20260409-0201", "Delivered", "Ship to address", ["sony-fx30-studio-cinema-camera", "atomos-ninja-creator-monitor-5", "sandisk-pro-cinema-cfexpress-type-b-512gb-card"], 24.95, 311.42, "Delivered to Studio Meridian"), - (carol, "BH-20260330-0301", "Delivered", "Ship to address", ["rode-wireless-creator-duo", "sennheiser-hd-490-pro-reference-headphones"], 0.00, 61.11, "Delivered to Signal Audio"), - (david, "BH-20260411-0401", "Processing", "Store pickup", ["apple-creatorbook-14-m3-pro-laptop", "benq-colorpro-32-pd3225u-monitor"], 0.00, 321.63, "Awaiting pickup at Chicago Pro Counter"), - ] - for user, order_number, status, fulfillment, slugs, shipping, tax, note in order_defs: - order = Order( - user_id=user.id, - order_number=order_number, - status=status, - fulfillment=fulfillment, - payment_label="Demo Visa ending in 4242", - shipping=shipping, - tax=round(tax, 2), - note=note, - created_at=MIRROR_REFERENCE_DATE - timedelta(days=1 + len(order_number)), - ) - db.session.add(order) + for index, user in enumerate(created_users): + department = departments[index % len(departments)] + shelf = [p for p in products if p.top_category_slug == department] or products + shelf = sorted(shelf, key=lambda p: p.id) + + for offset in range(min(3, len(shelf))): + product = shelf[(digest("wish", user.email, offset)) % len(shelf)] + if not WishlistItem.query.filter_by(user_id=user.id, product_id=product.id).first(): + db.session.add(WishlistItem(user_id=user.id, product_id=product.id, + created_at=MIRROR_REFERENCE_DATE - timedelta(days=9 + offset))) + + for offset in range(min(3, len(shelf))): + product = shelf[(digest("compare", user.email, offset)) % len(shelf)] + if not CompareItem.query.filter_by(user_id=user.id, product_id=product.id).first(): + db.session.add(CompareItem(user_id=user.id, product_id=product.id, + created_at=MIRROR_REFERENCE_DATE - timedelta(days=5 + offset))) + + for offset in range(min(2, len(shelf))): + product = shelf[(digest("cart", user.email, offset)) % len(shelf)] + if not CartItem.query.filter_by(user_id=user.id, product_id=product.id).first(): + db.session.add(CartItem(user_id=user.id, product_id=product.id, + quantity=1 + (digest("qty", user.email, offset) % 2), + variant_label="", bundle_label="", + added_at=MIRROR_REFERENCE_DATE - timedelta(days=3 + offset))) db.session.flush() - subtotal = 0 - for slug in slugs: - product = products[slug] - subtotal += product.display_price - db.session.add( - OrderItem( - order_id=order.id, - product_id=product.id, - product_name=product.name, - image_path=product.main_image, - quantity=1, - price=product.display_price, - variant_label="Standard", - ) + + # one delivered order and, for half the accounts, one still processing + statuses = [("Delivered", "Ship to address", 40 + index * 3)] + if index % 2 == 1: + statuses.append(("Processing", "Store pickup", 5 + index)) + for number, (status, fulfillment, days_ago) in enumerate(statuses): + items = [shelf[(digest("order", user.email, number, slot)) % len(shelf)] + for slot in range(2)] + items = list(dict.fromkeys(items)) + subtotal = round(sum(item.price for item in items), 2) + if subtotal <= 0: + continue + placed = MIRROR_REFERENCE_DATE - timedelta(days=days_ago) + order = Order( + user_id=user.id, + order_number=f"BH-{placed.strftime('%Y%m%d')}-{user.id:02d}{number:02d}", + status=status, subtotal=subtotal, shipping=0.0, + tax=round(subtotal * 0.08875, 2), total=round(subtotal * 1.08875, 2), + fulfillment=fulfillment, payment_label="Demo Visa ending in 4242", + note="Benchmark order created by the mirror seed.", created_at=placed, ) - order.subtotal = round(subtotal, 2) - order.total = round(order.subtotal + order.shipping + order.tax, 2) + db.session.add(order) + db.session.flush() + for item in items: + db.session.add(OrderItem( + order_id=order.id, product_id=item.id, product_name=item.name, + image_path=item.image_path, quantity=1, price=item.price, variant_label="", + )) + + if store and index % 2 == 0: + product = shelf[(digest("reserve", user.email)) % len(shelf)] + db.session.add(StoreReservation( + user_id=user.id, store_id=store.id, product_id=product.id, quantity=1, + status="Reserved", pickup_window="Ready in 2 hours", + created_at=MIRROR_REFERENCE_DATE - timedelta(days=2 + index), + )) db.session.commit() - -def copy_instance_to_seed(base_dir: str) -> None: - source = Path(base_dir) / "instance" / "bh_photo.db" - target_dir = Path(base_dir) / "instance_seed" - target_dir.mkdir(parents=True, exist_ok=True) - shutil.copy2(source, target_dir / "bh_photo.db") + canonicalize(db) + + +def canonicalize(db): + """Make a fresh build byte-comparable with the previous one. + + Two effects are normalised here. SQLAlchemy emits index DDL in set order, so + `sqlite_master` can list the same indexes in a different sequence between + runs, and identical rows can land in a different page layout. Recreating the + indexes by name and then rewriting the file with VACUUM removes both, which + is what lets a maintainer regenerate the shipped database and compare it. + + This runs only on a build that actually seeded. Both seed entry points + early-return on a populated database, so a container boot or a `/reset` + (which copies the already-populated seed file) never reaches here and never + rewrites the runtime database. + """ + rows = db.session.execute(db.text( + "SELECT name, sql FROM sqlite_master WHERE type='index' AND sql IS NOT NULL" + )).fetchall() + for name, statement in sorted(rows): + db.session.execute(db.text(f'DROP INDEX IF EXISTS "{name}"')) + db.session.execute(db.text(statement)) + db.session.commit() + db.session.execute(db.text("VACUUM")) + db.session.commit() diff --git a/sites/bh_photo/source_catalog.json b/sites/bh_photo/source_catalog.json new file mode 100644 index 000000000..fb27fcf3a --- /dev/null +++ b/sites/bh_photo/source_catalog.json @@ -0,0 +1,25896 @@ +{ + "generated_at": "2026-09-12T17:27:31Z", + "upstream": "https://www.bhphotovideo.com/", + "method": "Catalog facts read from dated Internet Archive captures of bhphotovideo.com; the live site answers automated requests with a bot challenge. Each product record carries the capture URL and timestamp it was read from. Fields the source does not state are null. Accounts, reviews, questions, bundles, store locations, carts and orders are NOT sourced - they are declared benchmark-synthetic state generated by seed_data.py.", + "departments": { + "photography": { + "name": "Photography", + "nav_order": 1, + "children": [ + "mirrorless-cameras", + "dslr-cameras", + "camera-lenses", + "tripods-supports", + "memory-cards-storage" + ] + }, + "computers": { + "name": "Computers", + "nav_order": 2, + "children": [ + "laptops", + "monitors", + "printers-scanners" + ] + }, + "pro-video": { + "name": "Pro Video", + "nav_order": 3, + "children": [ + "cinema-cameras", + "monitors-recorders" + ] + }, + "lighting": { + "name": "Lighting", + "nav_order": 4, + "children": [ + "lighting-kits" + ] + }, + "pro-audio": { + "name": "Pro Audio", + "nav_order": 5, + "children": [ + "microphones", + "headphones" + ] + }, + "drones": { + "name": "Drones", + "nav_order": 6, + "children": [ + "drones" + ] + } + }, + "subcategory_names": { + "mirrorless-cameras": "Mirrorless Cameras", + "dslr-cameras": "DSLR Cameras", + "camera-lenses": "Lenses", + "tripods-supports": "Tripods & Support", + "memory-cards-storage": "Memory Cards & Storage", + "cinema-cameras": "Cinema Cameras", + "monitors-recorders": "Monitors & Recorders", + "microphones": "Microphones", + "headphones": "Headphones", + "laptops": "Laptops", + "monitors": "Monitors", + "printers-scanners": "Printers & Scanners", + "lighting-kits": "Lighting", + "drones": "Drones" + }, + "product_count": 128, + "products": [ + { + "slug": "asus-16-vivobook-16-laptop-copilot-pc-cool-silver", + "name": "ASUS 16\" Vivobook 16 Laptop Copilot+ PC (Cool Silver)", + "brand": "ASUS", + "bh_sku": "ASM1607KAB75", + "mpn": "M1607KA-BS75", + "department_slug": "computers", + "subcategory_slug": "laptops", + "product_type": "Laptop", + "price_usd": 589.99, + "availability": "In Stock", + "condition": "New", + "description": "Harness the power of AI and get the full Microsoft Copilot experience with the ASUS 16\" Vivobook 16 Laptop Copilot+ PC. With AI NPU performance up to 50 TOPS and an AMD Ryzen AI 7 350 processor, the Vivobook 16 enhances your productivity and power efficiency through a variety of AI features. The dedicated Copilot key provides instant one-touch AI access. Add a 16\" IPS display, a backlit keyboard, and Wi-Fi 6, and the Vivobook 16 can handle your everyday needs with ease.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Operating System", + "value": "Windows 11 Home" + }, + { + "group": "Key Specs", + "label": "Processor", + "value": "AMD Ryzen AI 7 350" + }, + { + "group": "Key Specs", + "label": "GPU", + "value": "AMD Radeon" + }, + { + "group": "Key Specs", + "label": "Installed RAM", + "value": "16 GB" + }, + { + "group": "Key Specs", + "label": "Display Size", + "value": "16\"" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "1920 x 1200" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Total Installed Storage", + "value": "1 TB" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "2x USB-C 3.0 / 3.1/3.2 Gen 1 | 2x USB-A 3.0 / 3.1/3.2 Gen 1" + }, + { + "group": "Key Specs", + "label": "Display I/O", + "value": "1x HDMI 2.1 Output" + }, + { + "group": "Key Specs", + "label": "Wi-Fi", + "value": "Wi-Fi 6 (802.11ax)" + }, + { + "group": "Key Specs", + "label": "Bluetooth", + "value": "Bluetooth 5.3" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "4.14 lb / 1.88 kg" + }, + { + "group": "Key Specs", + "label": "Operating System", + "value": "Windows 11 Home" + }, + { + "group": "Performance", + "label": "Processor", + "value": "AMD Ryzen AI 7 350" + }, + { + "group": "Performance", + "label": "CPU", + "value": "8-Core: 2 to 5 GHz" + }, + { + "group": "Performance", + "label": "Dedicated AI Cores", + "value": "Yes: 50 TOPS" + }, + { + "group": "Performance", + "label": "L3 Cache", + "value": "24 MB" + }, + { + "group": "Performance", + "label": "GPU", + "value": "AMD Radeon" + }, + { + "group": "Performance", + "label": "Installed RAM", + "value": "16 GB" + }, + { + "group": "Performance", + "label": "RAM Type", + "value": "DDR5" + }, + { + "group": "Performance", + "label": "RAM Configuration / Capacity", + "value": "Onboard 16 GB / 1 Slots" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "LCD" + }, + { + "group": "Display", + "label": "Size", + "value": "16\"" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:10" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "1920 x 1200" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Display", + "label": "Finish", + "value": "Anti-Glare" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "300 nits / cd/m2" + }, + { + "group": "Display", + "label": "Color Gamut", + "value": "45% NTSC" + }, + { + "group": "Display", + "label": "Refresh Rate", + "value": "60 Hz" + }, + { + "group": "Display", + "label": "Variable Refresh Technology", + "value": "No" + }, + { + "group": "Storage and Expansion", + "label": "Total Installed Storage", + "value": "1 TB" + }, + { + "group": "Storage and Expansion", + "label": "Storage Drive Type", + "value": "1x 1 TB / M.2 NVMe SSD" + }, + { + "group": "Storage and Expansion", + "label": "Storage Expansion", + "value": "Fixed Storage / Cannot Be Upgraded" + }, + { + "group": "Inputs / Outputs", + "label": "Inputs/Outputs", + "value": "2x USB-C 3.0 / 3.1/3.2 Gen 1 / Supports Video Alt Mode and Power Delivery | 2x USB-A 3.0 / 3.1/3.2 Gen 1" + }, + { + "group": "Inputs / Outputs", + "label": "Display I/O", + "value": "1x HDMI 2.1 Output" + }, + { + "group": "Inputs / Outputs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm Headphone/Microphone Input/Output" + }, + { + "group": "Inputs / Outputs", + "label": "Network I/O", + "value": "No" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Speakers", + "value": "Yes" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Microphones", + "value": "Yes" + }, + { + "group": "Inputs / Outputs", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "Communications", + "label": "Wi-Fi", + "value": "Wi-Fi 6 (802.11ax) with MU-MIMO Support (2 x 2)" + }, + { + "group": "Communications", + "label": "Bluetooth", + "value": "Bluetooth 5.3" + }, + { + "group": "Communications", + "label": "Cellular Support", + "value": "No" + }, + { + "group": "Communications", + "label": "GPS", + "value": "No" + }, + { + "group": "Communications", + "label": "Webcam", + "value": "Yes: User-Facing 1080p" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion" + }, + { + "group": "Battery", + "label": "Capacity", + "value": "3-Cell: 42 Wh" + }, + { + "group": "Keyboard & Mouse", + "label": "Keyboard", + "value": "Built-In Chiclet-Style Keyboard with Backlight" + }, + { + "group": "Keyboard & Mouse", + "label": "Pointing Device", + "value": "TouchPad" + }, + { + "group": "General", + "label": "Security", + "value": "Facial Recognition, Firmware TPM (Software-Based), Webcam Blocker" + }, + { + "group": "General", + "label": "Power Supply", + "value": "65 W with USB-C" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR, REACH, RoHS" + }, + { + "group": "General", + "label": "Dimensions", + "value": "14.06 x 9.87 x 0.7\" / 357.12 x 250.7 x 17.78 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "4.14 lb / 1.88 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "6.7 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "19.4 x 12.1 x 3\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1901836-REG/asus_m1607ka_bs75_16_vivobook_16_laptop.html", + "archive_url": "https://web.archive.org/web/20260215134128/https://www.bhphotovideo.com/c/product/1901836-REG/asus_m1607ka_bs75_16_vivobook_16_laptop.html", + "archive_timestamp": "20260215134128", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "apple-13-macbook-air-kit-with-applecare-m4-midnight", + "name": "Apple 13\" MacBook Air Kit with AppleCare+ (M4, Midnight)", + "brand": "Apple", + "bh_sku": "APMC6C4LLAAC", + "mpn": null, + "department_slug": "computers", + "subcategory_slug": "laptops", + "product_type": "Laptop", + "price_usd": 1598.0, + "availability": "In Stock", + "condition": "New", + "description": "Keep your Apple 13\" MacBook Air protected with the Apple 13\" MacBook Air Kit with AppleCare+ from B&H. The MacBook Air features the powerful M4 CPU. The included AppleCare+ protection plan provides additional coverage for your MacBook Air.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Operating System", + "value": "macOS" + }, + { + "group": "Key Specs", + "label": "Processor", + "value": "Apple M4" + }, + { + "group": "Key Specs", + "label": "GPU", + "value": "Apple (10-Core)" + }, + { + "group": "Key Specs", + "label": "Installed RAM", + "value": "24 GB" + }, + { + "group": "Key Specs", + "label": "Display Size", + "value": "13.6\"" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "2560 x 1664" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Total Installed Storage", + "value": "512 GB" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) / Supports Video Alt Mode and Power Delivery" + }, + { + "group": "Key Specs", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax) with MU-MIMO Support" + }, + { + "group": "Key Specs", + "label": "Bluetooth", + "value": "5.3" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "2.7 lb / 1.24 kg" + }, + { + "group": "Performance", + "label": "Processor", + "value": "Apple M4" + }, + { + "group": "Performance", + "label": "CPU", + "value": "10-Core: | Performance (4 Cores) | Efficiency (6 Cores)" + }, + { + "group": "Performance", + "label": "Dedicated AI Cores", + "value": "Yes" + }, + { + "group": "Performance", + "label": "Graphics Type", + "value": "Integrated" + }, + { + "group": "Performance", + "label": "GPU", + "value": "Apple (10-Core)" + }, + { + "group": "Performance", + "label": "Installed RAM", + "value": "24 GB" + }, + { + "group": "Performance", + "label": "RAM Type", + "value": "Embedded DRAM" + }, + { + "group": "Performance", + "label": "RAM Configuration / Capacity", + "value": "Onboard Only/Not Upgradeable" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "IPS-Type LCD" + }, + { + "group": "Display", + "label": "Display Size", + "value": "13.6\"" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:10" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "2560 x 1664" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "500 nits / cd/m2" + }, + { + "group": "Display", + "label": "Refresh Rate", + "value": "60 Hz" + }, + { + "group": "Display", + "label": "Variable Refresh Technology", + "value": "No" + }, + { + "group": "Storage and Expansion", + "label": "Total Installed Storage", + "value": "512 GB" + }, + { + "group": "Storage and Expansion", + "label": "Storage Drive Type", + "value": "1x 512 GB / Integrated NVMe SSD" + }, + { + "group": "Storage and Expansion", + "label": "Storage Expansion", + "value": "Fixed Storage / Cannot Be Upgraded" + }, + { + "group": "Inputs / Outputs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) / Supports Video Alt Mode and Power Delivery" + }, + { + "group": "Inputs / Outputs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm Headphone Output" + }, + { + "group": "Inputs / Outputs", + "label": "Network I/O", + "value": "No" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Speakers", + "value": "Yes: 4" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Microphones", + "value": "Yes: 3" + }, + { + "group": "Inputs / Outputs", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "Communications", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax) with MU-MIMO Support" + }, + { + "group": "Communications", + "label": "Bluetooth", + "value": "5.3" + }, + { + "group": "Communications", + "label": "Cellular Support", + "value": "No" + }, + { + "group": "Communications", + "label": "GPS", + "value": "No" + }, + { + "group": "Communications", + "label": "Webcam", + "value": "User-Facing: 12 MP (1080p)" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion Polymer (LiPo)" + }, + { + "group": "Battery", + "label": "Capacity", + "value": "53.8 Wh" + }, + { + "group": "Keyboard & Mouse", + "label": "Keyboard", + "value": "Built-In Chiclet-Style Keyboard with Backlight" + }, + { + "group": "Keyboard & Mouse", + "label": "Pointing Device", + "value": "Force Touch Trackpad" + }, + { + "group": "General", + "label": "Security", + "value": "Fingerprint Reader" + }, + { + "group": "General", + "label": "Power Supply", + "value": "35 W with Magsafe" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "50 to 95°F / 10 to 35°C at 0 to 90% Humidity" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR" + }, + { + "group": "General", + "label": "Dimensions", + "value": "11.97 x 8.5 x 0.44\" / 30.41 x 21.5 x 1.13 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "2.7 lb / 1.24 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "5.115 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "14.8 x 11.2 x 2.7\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1901919-REG/apple_13_macbook_air_kit.html", + "archive_url": "https://web.archive.org/web/20251022120305/https://www.bhphotovideo.com/c/product/1901919-REG/apple_13_macbook_air_kit.html", + "archive_timestamp": "20251022120305", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "apple-13-macbook-air-kit-with-applecare-m4-sky-blue", + "name": "Apple 13\" MacBook Air Kit with AppleCare+ (M4, Sky Blue)", + "brand": "Apple", + "bh_sku": "APMC6T4LLAAC", + "mpn": null, + "department_slug": "computers", + "subcategory_slug": "laptops", + "product_type": "Laptop", + "price_usd": 1098.0, + "availability": "In Stock", + "condition": "New", + "description": "Keep your Apple 13\" MacBook Air protected with the Apple 13\" MacBook Air Kit with AppleCare+ from B&H. The MacBook Air features the powerful M4 CPU. The included AppleCare+ protection plan provides additional coverage for your MacBook Air.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Operating System", + "value": "macOS" + }, + { + "group": "Key Specs", + "label": "Processor", + "value": "Apple M4" + }, + { + "group": "Key Specs", + "label": "GPU", + "value": "Apple (8-Core)" + }, + { + "group": "Key Specs", + "label": "Installed RAM", + "value": "16 GB" + }, + { + "group": "Key Specs", + "label": "Display Size", + "value": "13.6\"" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "2560 x 1664" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Total Installed Storage", + "value": "256 GB" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) / Supports Video Alt Mode and Power Delivery" + }, + { + "group": "Key Specs", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax) with MU-MIMO Support" + }, + { + "group": "Key Specs", + "label": "Bluetooth", + "value": "5.3" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "2.7 lb / 1.24 kg" + }, + { + "group": "Performance", + "label": "Processor", + "value": "Apple M4" + }, + { + "group": "Performance", + "label": "CPU", + "value": "10-Core: | Performance (4 Cores) | Efficiency (6 Cores)" + }, + { + "group": "Performance", + "label": "Dedicated AI Cores", + "value": "Yes" + }, + { + "group": "Performance", + "label": "Graphics Type", + "value": "Integrated" + }, + { + "group": "Performance", + "label": "GPU", + "value": "Apple (8-Core)" + }, + { + "group": "Performance", + "label": "Installed RAM", + "value": "16 GB" + }, + { + "group": "Performance", + "label": "RAM Type", + "value": "Embedded DRAM" + }, + { + "group": "Performance", + "label": "RAM Configuration / Capacity", + "value": "Onboard Only/Not Upgradeable" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "IPS-Type LCD" + }, + { + "group": "Display", + "label": "Display Size", + "value": "13.6\"" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:10" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "2560 x 1664" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "500 nits / cd/m2" + }, + { + "group": "Display", + "label": "Refresh Rate", + "value": "60 Hz" + }, + { + "group": "Display", + "label": "Variable Refresh Technology", + "value": "No" + }, + { + "group": "Storage and Expansion", + "label": "Total Installed Storage", + "value": "256 GB" + }, + { + "group": "Storage and Expansion", + "label": "Storage Drive Type", + "value": "1x 256 GB / Integrated NVMe SSD" + }, + { + "group": "Storage and Expansion", + "label": "Storage Expansion", + "value": "x Fixed Storage / Cannot Be Upgraded" + }, + { + "group": "Inputs / Outputs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) / Supports Video Alt Mode and Power Delivery" + }, + { + "group": "Inputs / Outputs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm Headphone Output" + }, + { + "group": "Inputs / Outputs", + "label": "Network I/O", + "value": "No" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Speakers", + "value": "Yes: 4" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Microphones", + "value": "Yes: 3" + }, + { + "group": "Inputs / Outputs", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "Communications", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax) with MU-MIMO Support" + }, + { + "group": "Communications", + "label": "Bluetooth", + "value": "5.3" + }, + { + "group": "Communications", + "label": "Cellular Support", + "value": "No" + }, + { + "group": "Communications", + "label": "GPS", + "value": "No" + }, + { + "group": "Communications", + "label": "Webcam", + "value": "User-Facing: 12 MP (1080p)" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion Polymer (LiPo)" + }, + { + "group": "Battery", + "label": "Capacity", + "value": "53.8 Wh" + }, + { + "group": "Keyboard & Mouse", + "label": "Keyboard", + "value": "Built-In Chiclet-Style Keyboard with Backlight" + }, + { + "group": "Keyboard & Mouse", + "label": "Pointing Device", + "value": "Force Touch Trackpad" + }, + { + "group": "General", + "label": "Security", + "value": "Fingerprint Reader" + }, + { + "group": "General", + "label": "Power Supply", + "value": "30 W with Magsafe" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "50 to 95°F / 10 to 35°C at 0 to 90% Humidity" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR" + }, + { + "group": "General", + "label": "Dimensions", + "value": "11.97 x 8.5 x 0.44\" / 30.41 x 21.5 x 1.13 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "2.7 lb / 1.24 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "5.115 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "16.3 x 11.2 x 2.6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1901833-REG/apple_13_macbook_air_kit.html", + "archive_url": "https://web.archive.org/web/20251017003049/https://www.bhphotovideo.com/c/product/1901833-REG/apple_13_macbook_air_kit.html", + "archive_timestamp": "20251017003049", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "apple-14-macbook-pro-m4-space-black", + "name": "Apple 14\" MacBook Pro (M4, Space Black)", + "brand": "Apple", + "bh_sku": "AISUK0AJ", + "mpn": null, + "department_slug": "computers", + "subcategory_slug": "laptops", + "product_type": "Laptop", + "price_usd": 1599.0, + "availability": "In Stock", + "condition": "New", + "description": "Built for entrepreneurs, students, creators, and more, the Apple 14\" MacBook Pro delivers the power to drive demanding creative apps, allowing professionals to get more done in less time. The system features the Apple M4 10-Core Chip, which provides the power and performance efficiency needed to handle all your creative workflows. Now built on 3nm process technology, the M4 10-Core Chip is combined with a 10-Core GPU. The next-gen GPU features Dynamic Caching, hardware-accelerated ray tracing, and mesh shading, all of which significantly increase performance for the most demanding creative apps and games. Also featured is a 16-core Neural Engine with Apple Intelligence. Add 24GB of unified RAM, 512GB of SSD storage, and Thunderbolt 4, and the MacBook Pro allows you to load massive files and launch apps quickly, enabling you to work with photo and video libraries from almost anywhere. The 12MP Center Stage camera delivers enhanced video quality in challenging lighting conditions and automatically keeps you centered in the frame.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Operating System", + "value": "macOS" + }, + { + "group": "Key Specs", + "label": "Processor", + "value": "Apple M4" + }, + { + "group": "Key Specs", + "label": "GPU", + "value": "Apple (10-Core)" + }, + { + "group": "Key Specs", + "label": "Installed RAM", + "value": "24 GB" + }, + { + "group": "Key Specs", + "label": "Display Size", + "value": "14.2\"" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "3024 x 1964" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Total Installed Storage", + "value": "512 GB" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "3x USB-C (Thunderbolt 4) / Supports Video Alt Mode and Power Delivery" + }, + { + "group": "Key Specs", + "label": "Display I/O", + "value": "1x HDMI Output" + }, + { + "group": "Key Specs", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax) with MU-MIMO Support" + }, + { + "group": "Key Specs", + "label": "Bluetooth", + "value": "5.3" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "3.4 lb / 1.5 kg" + }, + { + "group": "Performance", + "label": "Processor", + "value": "Apple M4" + }, + { + "group": "Performance", + "label": "CPU", + "value": "10-Core: | Performance (4 Cores) | Efficiency (6 Cores)" + }, + { + "group": "Performance", + "label": "Dedicated AI Cores", + "value": "Yes" + }, + { + "group": "Performance", + "label": "Graphics Type", + "value": "Integrated" + }, + { + "group": "Performance", + "label": "GPU", + "value": "Apple (10-Core)" + }, + { + "group": "Performance", + "label": "Installed RAM", + "value": "24 GB" + }, + { + "group": "Performance", + "label": "RAM Type", + "value": "Embedded DRAM" + }, + { + "group": "Performance", + "label": "RAM Configuration / Capacity", + "value": "Onboard Only/Not Upgradeable" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "LCD with Mini-LED Backlight" + }, + { + "group": "Display", + "label": "Display Size", + "value": "14.2\"" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:10" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "3024 x 1964" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Display", + "label": "Finish", + "value": "Anti-Glare" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "1000 nits / cd/m2 (Sustained) | 1600 nits / cd/m2 (Peak in HDR Mode)" + }, + { + "group": "Display", + "label": "Refresh Rate", + "value": "120 Hz" + }, + { + "group": "Display", + "label": "Contrast Ratio", + "value": "1,000,000:1" + }, + { + "group": "Display", + "label": "Variable Refresh Technology", + "value": "Apple ProMotion" + }, + { + "group": "Storage and Expansion", + "label": "Total Installed Storage", + "value": "512 GB" + }, + { + "group": "Storage and Expansion", + "label": "Storage Drive Type", + "value": "1x 512 GB / Integrated NVMe SSD" + }, + { + "group": "Storage and Expansion", + "label": "Storage Expansion", + "value": "Fixed Storage / Cannot Be Upgraded" + }, + { + "group": "Inputs / Outputs", + "label": "Inputs/Outputs", + "value": "3x USB-C (Thunderbolt 4) / Supports Video Alt Mode and Power Delivery" + }, + { + "group": "Inputs / Outputs", + "label": "Display I/O", + "value": "1x HDMI Output" + }, + { + "group": "Inputs / Outputs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm Headphone Output" + }, + { + "group": "Inputs / Outputs", + "label": "Network I/O", + "value": "No" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Speakers", + "value": "Yes: 6 and Subwoofer" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Microphones", + "value": "Yes: 3" + }, + { + "group": "Inputs / Outputs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC" + }, + { + "group": "Communications", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax) with MU-MIMO Support" + }, + { + "group": "Communications", + "label": "Bluetooth", + "value": "5.3" + }, + { + "group": "Communications", + "label": "Cellular Support", + "value": "No" + }, + { + "group": "Communications", + "label": "GPS", + "value": "No" + }, + { + "group": "Communications", + "label": "Webcam", + "value": "Yes: User-Facing 12 MP (1080p)" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion Polymer (LiPo)" + }, + { + "group": "Battery", + "label": "Capacity", + "value": "72.4 Wh" + }, + { + "group": "Keyboard & Mouse", + "label": "Keyboard", + "value": "Built-In Chiclet-Style Keyboard with Backlight" + }, + { + "group": "Keyboard & Mouse", + "label": "Pointing Device", + "value": "Force Touch Trackpad" + }, + { + "group": "General", + "label": "Security", + "value": "Fingerprint Reader" + }, + { + "group": "General", + "label": "Power Supply", + "value": "70 W with Magsafe" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 60 / 50 Hz" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "50 to 95°F / 10 to 35°C at 0 to 90% Humidity" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR" + }, + { + "group": "General", + "label": "Dimensions", + "value": "12.31 x 8.71 x 0.61\" / 31.27 x 22.12 x 1.55 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "3.4 lb / 1.5 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "6.39 lb" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1915606-REG/apple_14_macbook_pro_m4_.html", + "archive_url": "https://web.archive.org/web/20251214133727/https://www.bhphotovideo.com/c/product/1915606-REG/apple_14_macbook_pro_m4_.html", + "archive_timestamp": "20251214133727", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "apple-14-macbook-pro-m5-silver", + "name": "Apple 14\" MacBook Pro (M5, Silver)", + "brand": "Apple", + "bh_sku": "APMDE44LLA", + "mpn": "MDE44LL/A", + "department_slug": "computers", + "subcategory_slug": "laptops", + "product_type": "Laptop", + "price_usd": 1549.0, + "availability": "In Stock", + "condition": "New", + "description": "Now with the powerful M5 chip, the Apple 14\" MacBook Pro delivers a huge leap in AI performance. The M5 chip features a next-generation 10-Core GPU with a Neural Accelerator in each core, delivering up to 3.5x the AI performance and up to 1.6x faster graphics than the previous generation. The M5 chip also includes a faster and more efficient CPU, an enhanced Neural Engine, and higher memory bandwidth that accelerates everything from launching apps to running large language models (LLMs) on device. The M5 chip also brings faster SSD performance than the previous generation for tasks, such as importing RAW image files or exporting videos. Additionally, it offers optimal battery life of up to 24 hours, so you can take your pro workflows anywhere.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Operating System", + "value": "macOS" + }, + { + "group": "Key Specs", + "label": "Processor", + "value": "Apple M5" + }, + { + "group": "Key Specs", + "label": "GPU", + "value": "Apple (10-Core)" + }, + { + "group": "Key Specs", + "label": "Installed RAM", + "value": "16 GB" + }, + { + "group": "Key Specs", + "label": "Display Size", + "value": "14.2\"" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "3024 x 1964" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Total Installed Storage", + "value": "512 GB" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "3x USB-C (Thunderbolt 4) / Supports Video Alt Mode and Power Delivery" + }, + { + "group": "Key Specs", + "label": "Display I/O", + "value": "1x HDMI Output" + }, + { + "group": "Key Specs", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax)" + }, + { + "group": "Key Specs", + "label": "Bluetooth", + "value": "5.3" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "3.4 lb / 1.5 kg" + }, + { + "group": "Performance", + "label": "Processor", + "value": "Apple M5" + }, + { + "group": "Performance", + "label": "CPU", + "value": "10-Core: | Performance (4 Cores) | Efficiency (6 Cores)" + }, + { + "group": "Performance", + "label": "Dedicated AI Cores", + "value": "Yes" + }, + { + "group": "Performance", + "label": "Graphics Type", + "value": "Integrated" + }, + { + "group": "Performance", + "label": "GPU", + "value": "Apple (10-Core)" + }, + { + "group": "Performance", + "label": "Installed RAM", + "value": "16 GB" + }, + { + "group": "Performance", + "label": "RAM Type", + "value": "Unified Memory" + }, + { + "group": "Performance", + "label": "RAM Configuration / Capacity", + "value": "Onboard Only/Not Upgradeable" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "LCD with Mini-LED Backlight" + }, + { + "group": "Display", + "label": "Display Size", + "value": "14.2\"" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:10" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "3024 x 1964" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Display", + "label": "Finish", + "value": "Anti-Glare" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "1000 nits / cd/m2 (Sustained) | 1600 nits / cd/m2 (Peak in HDR Mode)" + }, + { + "group": "Display", + "label": "Refresh Rate", + "value": "120 Hz" + }, + { + "group": "Display", + "label": "Contrast Ratio", + "value": "1,000,000:1" + }, + { + "group": "Display", + "label": "Variable Refresh Technology", + "value": "Apple ProMotion" + }, + { + "group": "Storage and Expansion", + "label": "Total Installed Storage", + "value": "512 GB" + }, + { + "group": "Storage and Expansion", + "label": "Storage Drive Type", + "value": "1x 512 TB / M.2 NVMe SSD" + }, + { + "group": "Storage and Expansion", + "label": "Storage Expansion", + "value": "Fixed Storage / Cannot Be Upgraded" + }, + { + "group": "Inputs / Outputs", + "label": "Inputs/Outputs", + "value": "3x USB-C (Thunderbolt 4) / Supports Video Alt Mode and Power Delivery" + }, + { + "group": "Inputs / Outputs", + "label": "Display I/O", + "value": "1x HDMI Output" + }, + { + "group": "Inputs / Outputs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm Headphone/Microphone Input/Output" + }, + { + "group": "Inputs / Outputs", + "label": "Network I/O", + "value": "No" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Speakers", + "value": "Yes: 6 and Subwoofer" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Microphones", + "value": "Yes: 3" + }, + { + "group": "Inputs / Outputs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC" + }, + { + "group": "Communications", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax)" + }, + { + "group": "Communications", + "label": "Bluetooth", + "value": "5.3" + }, + { + "group": "Communications", + "label": "Cellular Support", + "value": "No" + }, + { + "group": "Communications", + "label": "GPS", + "value": "No" + }, + { + "group": "Communications", + "label": "Webcam", + "value": "User-Facing: 12 MP (1080p)" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion Polymer (LiPo)" + }, + { + "group": "Battery", + "label": "Capacity", + "value": "Non-Removable: 72.4 Wh" + }, + { + "group": "Keyboard & Mouse", + "label": "Keyboard", + "value": "Built-In Chiclet-Style Keyboard with Backlight" + }, + { + "group": "Keyboard & Mouse", + "label": "Pointing Device", + "value": "Force Touch Trackpad" + }, + { + "group": "General", + "label": "Security", + "value": "Fingerprint Reader" + }, + { + "group": "General", + "label": "Power Supply", + "value": "70 W with Magsafe" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "50 to 95°F / 10 to 35°C up to90% Humidity" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR" + }, + { + "group": "General", + "label": "Dimensions", + "value": "12.31 x 8.71 x 0.61\" / 312.67 x 221.23 x 15.49 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "3.4 lb / 1.5 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "6.455 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "15.8 x 11.8 x 3.4\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1925478-REG/apple_mde44ll_a_14_macbook_pro_m5.html", + "archive_url": "https://web.archive.org/web/20251103174932/https://www.bhphotovideo.com/c/product/1925478-REG/apple_mde44ll_a_14_macbook_pro_m5.html", + "archive_timestamp": "20251103174932", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "apple-15-macbook-air-m4-70w-power-adapter-midnight", + "name": "Apple 15\" MacBook Air (M4, 70W Power Adapter, Midnight)", + "brand": "Apple", + "bh_sku": "APMW1L3LL70W", + "mpn": "Z1DG000G4", + "department_slug": "computers", + "subcategory_slug": "laptops", + "product_type": "Laptop", + "price_usd": 1049.0, + "availability": "In Stock", + "condition": "New", + "description": "Now powered by the M4 chip, the compact, lightweight Apple 15\" MacBook Air provides the power and performance efficiency needed to handle all your creative workflows while on the go. Now built on 3nm process technology, the M4 10-Core Chip is combined with a 10-Core GPU. The next-gen GPU features Dynamic Caching, hardware-accelerated ray tracing, and mesh shading, all of which significantly increase performance for the most demanding creative apps and games. Also featured is a 16-core Neural Engine with Apple Intelligence for AI-powered features, such as Writing Tools, Image Playground, Siri, and more.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Operating System", + "value": "macOS" + }, + { + "group": "Key Specs", + "label": "Processor", + "value": "Apple M4" + }, + { + "group": "Key Specs", + "label": "GPU", + "value": "Apple (10-Core)" + }, + { + "group": "Key Specs", + "label": "Installed RAM", + "value": "16 GB" + }, + { + "group": "Key Specs", + "label": "Display Size", + "value": "15.3\"" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "2880 x 1864" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Total Installed Storage", + "value": "256 GB" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) / Supports Video Alt Mode and Power Delivery" + }, + { + "group": "Key Specs", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax) with MU-MIMO Support" + }, + { + "group": "Key Specs", + "label": "Bluetooth", + "value": "5.3" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "3.3 lb / 1.51 kg" + }, + { + "group": "Performance", + "label": "Processor", + "value": "Apple M4" + }, + { + "group": "Performance", + "label": "CPU", + "value": "10-Core: | Performance (4 Cores) | Efficiency (6 Cores)" + }, + { + "group": "Performance", + "label": "Dedicated AI Cores", + "value": "Yes" + }, + { + "group": "Performance", + "label": "Graphics Type", + "value": "Integrated" + }, + { + "group": "Performance", + "label": "GPU", + "value": "Apple (10-Core)" + }, + { + "group": "Performance", + "label": "Installed RAM", + "value": "16 GB" + }, + { + "group": "Performance", + "label": "RAM Type", + "value": "Embedded DRAM" + }, + { + "group": "Performance", + "label": "RAM Configuration / Capacity", + "value": "Onboard Only/Not Upgradeable" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "IPS-Type LCD" + }, + { + "group": "Display", + "label": "Display Size", + "value": "15.3\"" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:10" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "2880 x 1864" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "500 nits / cd/m2 (Sustained)" + }, + { + "group": "Display", + "label": "Refresh Rate", + "value": "60 Hz" + }, + { + "group": "Display", + "label": "Variable Refresh Technology", + "value": "No" + }, + { + "group": "Storage and Expansion", + "label": "Total Installed Storage", + "value": "256 GB" + }, + { + "group": "Storage and Expansion", + "label": "Storage Drive Type", + "value": "1x 256 GB / Integrated NVMe SSD" + }, + { + "group": "Storage and Expansion", + "label": "Storage Expansion", + "value": "Fixed Storage / Cannot Be Upgraded" + }, + { + "group": "Inputs / Outputs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) / Supports Video Alt Mode and Power Delivery" + }, + { + "group": "Inputs / Outputs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm Headphone/Microphone Input/Output" + }, + { + "group": "Inputs / Outputs", + "label": "Network I/O", + "value": "No" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Speakers", + "value": "Yes: 6 and Subwoofer" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Microphones", + "value": "Yes: 3" + }, + { + "group": "Inputs / Outputs", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "Communications", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax) with MU-MIMO Support" + }, + { + "group": "Communications", + "label": "Bluetooth", + "value": "5.3" + }, + { + "group": "Communications", + "label": "Cellular Support", + "value": "No" + }, + { + "group": "Communications", + "label": "GPS", + "value": "No" + }, + { + "group": "Communications", + "label": "Webcam", + "value": "User-Facing: 12 MP (1080p)" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion Polymer (LiPo)" + }, + { + "group": "Battery", + "label": "Capacity", + "value": "Non-Removable: 66.5 Wh" + }, + { + "group": "Keyboard & Mouse", + "label": "Keyboard", + "value": "Built-In Chiclet-Style Keyboard with Backlight" + }, + { + "group": "Keyboard & Mouse", + "label": "Pointing Device", + "value": "Force Touch Trackpad" + }, + { + "group": "General", + "label": "Security", + "value": "Fingerprint Reader" + }, + { + "group": "General", + "label": "Power Supply", + "value": "70 W with Magsafe" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "50 to 95°F / 10 to 35°C at 0 to 90% Humidity" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR" + }, + { + "group": "General", + "label": "Dimensions", + "value": "13.4 x 9.35 x 0.45\" / 34.04 x 23.76 x 1.15 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "3.3 lb / 1.51 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "6.6 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "17.2 x 13.5 x 3\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1919952-REG/apple_z1dg000g4_15_macbook_air_m4.html", + "archive_url": "https://web.archive.org/web/20251029182354/https://www.bhphotovideo.com/c/product/1919952-REG/apple_z1dg000g4_15_macbook_air_m4.html", + "archive_timestamp": "20251029182354", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "apple-15-macbook-air-m4-70w-power-adapter-sky-blue", + "name": "Apple 15\" MacBook Air (M4, 70W Power Adapter, Sky Blue)", + "brand": "Apple", + "bh_sku": "APMC7D4LL70W", + "mpn": "Z1HD000QV", + "department_slug": "computers", + "subcategory_slug": "laptops", + "product_type": "Laptop", + "price_usd": 1599.0, + "availability": "In Stock", + "condition": "New", + "description": "Now powered by the M4 chip, the compact, lightweight Apple 15\" MacBook Air provides the power and performance efficiency needed to handle all your creative workflows while on the go. Now built on 3nm process technology, the M4 10-Core Chip is combined with a 10-Core GPU. The next-gen GPU features Dynamic Caching, hardware-accelerated ray tracing, and mesh shading, all of which significantly increase performance for the most demanding creative apps and games. Also featured is a 16-core Neural Engine with Apple Intelligence for AI-powered features, such as Writing Tools, Image Playground, Siri, and more.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Operating System", + "value": "macOS" + }, + { + "group": "Key Specs", + "label": "Processor", + "value": "Apple M4" + }, + { + "group": "Key Specs", + "label": "GPU", + "value": "Apple (10-Core)" + }, + { + "group": "Key Specs", + "label": "Installed RAM", + "value": "24 GB" + }, + { + "group": "Key Specs", + "label": "Display Size", + "value": "15.3\"" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "2880 x 1864" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Total Installed Storage", + "value": "512 GB" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) / Supports Video Alt Mode and Power Delivery" + }, + { + "group": "Key Specs", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax) with MU-MIMO Support" + }, + { + "group": "Key Specs", + "label": "Bluetooth", + "value": "5.3" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "3.3 lb / 1.51 kg" + }, + { + "group": "Performance", + "label": "Processor", + "value": "Apple M4" + }, + { + "group": "Performance", + "label": "CPU", + "value": "10-Core: | Performance (4 Cores) | Efficiency (6 Cores)" + }, + { + "group": "Performance", + "label": "Dedicated AI Cores", + "value": "Yes" + }, + { + "group": "Performance", + "label": "Graphics Type", + "value": "Integrated" + }, + { + "group": "Performance", + "label": "GPU", + "value": "Apple (10-Core)" + }, + { + "group": "Performance", + "label": "Installed RAM", + "value": "24 GB" + }, + { + "group": "Performance", + "label": "RAM Type", + "value": "Embedded DRAM" + }, + { + "group": "Performance", + "label": "RAM Configuration / Capacity", + "value": "Onboard Only/Not Upgradeable" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "IPS-Type LCD" + }, + { + "group": "Display", + "label": "Display Size", + "value": "15.3\"" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:10" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "2880 x 1864" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "500 nits / cd/m2 (Sustained)" + }, + { + "group": "Display", + "label": "Refresh Rate", + "value": "60 Hz" + }, + { + "group": "Display", + "label": "Variable Refresh Technology", + "value": "No" + }, + { + "group": "Storage and Expansion", + "label": "Total Installed Storage", + "value": "512 GB" + }, + { + "group": "Storage and Expansion", + "label": "Storage Drive Type", + "value": "1x 512 GB / Integrated NVMe SSD" + }, + { + "group": "Storage and Expansion", + "label": "Storage Expansion", + "value": "Fixed Storage / Cannot Be Upgraded" + }, + { + "group": "Inputs / Outputs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) / Supports Video Alt Mode and Power Delivery" + }, + { + "group": "Inputs / Outputs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm Headphone/Microphone Input/Output" + }, + { + "group": "Inputs / Outputs", + "label": "Network I/O", + "value": "No" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Speakers", + "value": "Yes: 6 and Subwoofer" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Microphones", + "value": "Yes: 3" + }, + { + "group": "Inputs / Outputs", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "Communications", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax) with MU-MIMO Support" + }, + { + "group": "Communications", + "label": "Bluetooth", + "value": "5.3" + }, + { + "group": "Communications", + "label": "Cellular Support", + "value": "No" + }, + { + "group": "Communications", + "label": "GPS", + "value": "No" + }, + { + "group": "Communications", + "label": "Webcam", + "value": "User-Facing: 12 MP (1080p)" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion Polymer (LiPo)" + }, + { + "group": "Battery", + "label": "Capacity", + "value": "Non-Removable: 66.5 Wh" + }, + { + "group": "Keyboard & Mouse", + "label": "Keyboard", + "value": "Built-In Chiclet-Style Keyboard with Backlight" + }, + { + "group": "Keyboard & Mouse", + "label": "Pointing Device", + "value": "Force Touch Trackpad" + }, + { + "group": "General", + "label": "Security", + "value": "Fingerprint Reader" + }, + { + "group": "General", + "label": "Power Supply", + "value": "70 W with Magsafe" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "50 to 95°F / 10 to 35°C at 0 to 90% Humidity" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR" + }, + { + "group": "General", + "label": "Dimensions", + "value": "13.4 x 9.35 x 0.45\" / 34.04 x 23.76 x 1.15 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "3.3 lb / 1.51 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "6.59 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "17.2 x 12.7 x 2.9\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1919964-REG/apple_z1hd000qv_15_macbook_air_m4.html", + "archive_url": "https://web.archive.org/web/20251117223806/https://www.bhphotovideo.com/c/product/1919964-REG/apple_z1hd000qv_15_macbook_air_m4.html", + "archive_timestamp": "20251117223806", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "apple-15-macbook-air-m4-midnight", + "name": "Apple 15\" MacBook Air (M4, Midnight)", + "brand": "Apple", + "bh_sku": "AISYT2KG", + "mpn": null, + "department_slug": "computers", + "subcategory_slug": "laptops", + "product_type": "Laptop", + "price_usd": 1899.0, + "availability": "In Stock", + "condition": "New", + "description": "Now powered by the M4 chip, the compact, lightweight Apple 15\" MacBook Air provides the power and performance efficiency needed to handle all your creative workflows while on the go. Now built on 3nm process technology, the M4 10-Core Chip is combined with a 10-Core GPU. The next-gen GPU features Dynamic Caching, hardware-accelerated ray tracing, and mesh shading, all of which significantly increase performance for the most demanding creative apps and games. Also featured is a 16-core Neural Engine with Apple Intelligence for AI-powered features, such as Writing Tools, Image Playground, Siri, and more.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Operating System", + "value": "macOS" + }, + { + "group": "Key Specs", + "label": "Processor", + "value": "Apple M4" + }, + { + "group": "Key Specs", + "label": "GPU", + "value": "Apple (10-Core)" + }, + { + "group": "Key Specs", + "label": "Installed RAM", + "value": "32 GB" + }, + { + "group": "Key Specs", + "label": "Display Size", + "value": "15.3\"" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "2880 x 1864" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Total Installed Storage", + "value": "1 TB" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4)" + }, + { + "group": "Key Specs", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax)" + }, + { + "group": "Key Specs", + "label": "Bluetooth", + "value": "Bluetooth 5.3" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "3.3 lb / 1.51 kg" + }, + { + "group": "Key Specs", + "label": "Operating System", + "value": "macOS" + }, + { + "group": "Performance", + "label": "Processor", + "value": "Apple M4" + }, + { + "group": "Performance", + "label": "CPU", + "value": "10-Core: | Performance (4 Cores) | Efficiency (6 Cores)" + }, + { + "group": "Performance", + "label": "Dedicated AI Cores", + "value": "Yes" + }, + { + "group": "Performance", + "label": "GPU", + "value": "Apple (10-Core)" + }, + { + "group": "Performance", + "label": "Installed RAM", + "value": "32 GB" + }, + { + "group": "Performance", + "label": "RAM Type", + "value": "Embedded DRAM" + }, + { + "group": "Performance", + "label": "RAM Configuration / Capacity", + "value": "Onboard Only/Not Upgradeable" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "IPS-Type LCD" + }, + { + "group": "Display", + "label": "Size", + "value": "15.3\"" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:10" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "2880 x 1864" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Display", + "label": "Finish", + "value": "Anti-Glare" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "500 nits / cd/m2 (Sustained)" + }, + { + "group": "Display", + "label": "Refresh Rate", + "value": "60 Hz" + }, + { + "group": "Display", + "label": "Variable Refresh Technology", + "value": "No" + }, + { + "group": "Storage and Expansion", + "label": "Total Installed Storage", + "value": "1 TB" + }, + { + "group": "Storage and Expansion", + "label": "Storage Drive Type", + "value": "1x 1 TB / Integrated NVMe SSD" + }, + { + "group": "Storage and Expansion", + "label": "Storage Expansion", + "value": "Fixed Storage / Cannot Be Upgraded" + }, + { + "group": "Inputs / Outputs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) / Supports Power Delivery" + }, + { + "group": "Inputs / Outputs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm Headphone/Microphone Input/Output" + }, + { + "group": "Inputs / Outputs", + "label": "Network I/O", + "value": "No" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Speakers", + "value": "Yes: 6 and Subwoofer" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Microphones", + "value": "Yes: 3" + }, + { + "group": "Inputs / Outputs", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "Communications", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax) with MU-MIMO Support" + }, + { + "group": "Communications", + "label": "Bluetooth", + "value": "Bluetooth 5.3" + }, + { + "group": "Communications", + "label": "Cellular Support", + "value": "No" + }, + { + "group": "Communications", + "label": "GPS", + "value": "No" + }, + { + "group": "Communications", + "label": "Webcam", + "value": "Yes: User-Facing 12 MP (1080p)" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion Polymer (LiPo)" + }, + { + "group": "Battery", + "label": "Capacity", + "value": "66.5 Wh" + }, + { + "group": "Keyboard & Mouse", + "label": "Keyboard", + "value": "Built-In Chiclet-Style Keyboard with Backlight" + }, + { + "group": "Keyboard & Mouse", + "label": "Pointing Device", + "value": "Force Touch Trackpad" + }, + { + "group": "General", + "label": "Security", + "value": "Fingerprint Reader" + }, + { + "group": "General", + "label": "Power Supply", + "value": "35 W with Magsafe" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "50 to 95°F / 10 to 35°C at 0 to 90% Humidity" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR" + }, + { + "group": "General", + "label": "Dimensions", + "value": "13.4 x 9.35 x 0.45\" / 34.04 x 23.76 x 1.15 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "3.3 lb / 1.51 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "6.29 lb" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1934788-REG/apple_15_macbook_air_m4_.html", + "archive_url": "https://web.archive.org/web/20260225065818/https://www.bhphotovideo.com/c/product/1934788-REG/apple_15_macbook_air_m4_.html", + "archive_timestamp": "20260225065818", + "fetched_at": "2026-09-12T17:27:30Z" + } + }, + { + "slug": "apple-15-macbook-air-kit-with-applecare-m4-midnight", + "name": "Apple 15\" MacBook Air Kit with AppleCare+ (M4, Midnight)", + "brand": "Apple", + "bh_sku": "APMC6L4LLAAC", + "mpn": null, + "department_slug": "computers", + "subcategory_slug": "laptops", + "product_type": "Laptop", + "price_usd": 1658.0, + "availability": "In Stock", + "condition": "New", + "description": "Keep your Apple 15\" MacBook Air protected with the Apple 15\" MacBook Air Kit with AppleCare+ from B&H. The MacBook Air features the powerful M4 CPU. The included AppleCare+ protection plan provides additional coverage for your MacBook Air.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Operating System", + "value": "macOS" + }, + { + "group": "Key Specs", + "label": "Processor", + "value": "Apple M4" + }, + { + "group": "Key Specs", + "label": "GPU", + "value": "Apple (10-Core)" + }, + { + "group": "Key Specs", + "label": "Installed RAM", + "value": "24 GB" + }, + { + "group": "Key Specs", + "label": "Display Size", + "value": "15.3\"" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "2880 x 1864" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Total Installed Storage", + "value": "512 GB" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) / Supports Video Alt Mode and Power Delivery" + }, + { + "group": "Key Specs", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax) with MU-MIMO Support" + }, + { + "group": "Key Specs", + "label": "Bluetooth", + "value": "5.3" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "3.3 lb / 1.51 kg" + }, + { + "group": "Performance", + "label": "Processor", + "value": "Apple M4" + }, + { + "group": "Performance", + "label": "CPU", + "value": "10-Core: | Performance (4 Cores) | Efficiency (6 Cores)" + }, + { + "group": "Performance", + "label": "Dedicated AI Cores", + "value": "Yes" + }, + { + "group": "Performance", + "label": "Graphics Type", + "value": "Integrated" + }, + { + "group": "Performance", + "label": "GPU", + "value": "Apple (10-Core)" + }, + { + "group": "Performance", + "label": "Installed RAM", + "value": "24 GB" + }, + { + "group": "Performance", + "label": "RAM Type", + "value": "Embedded DRAM" + }, + { + "group": "Performance", + "label": "RAM Configuration / Capacity", + "value": "Onboard Only/Not Upgradeable" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "IPS-Type LCD" + }, + { + "group": "Display", + "label": "Display Size", + "value": "15.3\"" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:10" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "2880 x 1864" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "500 nits / cd/m2 (Sustained)" + }, + { + "group": "Display", + "label": "Refresh Rate", + "value": "60 Hz" + }, + { + "group": "Display", + "label": "Variable Refresh Technology", + "value": "No" + }, + { + "group": "Storage and Expansion", + "label": "Total Installed Storage", + "value": "512 GB" + }, + { + "group": "Storage and Expansion", + "label": "Storage Drive Type", + "value": "1x 512 GB / Integrated NVMe SSD" + }, + { + "group": "Storage and Expansion", + "label": "Storage Expansion", + "value": "x Fixed Storage / Cannot Be Upgraded" + }, + { + "group": "Inputs / Outputs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) / Supports Video Alt Mode and Power Delivery" + }, + { + "group": "Inputs / Outputs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm Headphone/Microphone Input/Output" + }, + { + "group": "Inputs / Outputs", + "label": "Network I/O", + "value": "No" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Speakers", + "value": "Yes: 6 and Subwoofer" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Microphones", + "value": "Yes: 3" + }, + { + "group": "Inputs / Outputs", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "Communications", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax) with MU-MIMO Support" + }, + { + "group": "Communications", + "label": "Bluetooth", + "value": "5.3" + }, + { + "group": "Communications", + "label": "Cellular Support", + "value": "No" + }, + { + "group": "Communications", + "label": "GPS", + "value": "No" + }, + { + "group": "Communications", + "label": "Webcam", + "value": "User-Facing: 12 MP (1080p)" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion Polymer (LiPo)" + }, + { + "group": "Battery", + "label": "Capacity", + "value": "Non-Removable: 66.5 Wh" + }, + { + "group": "Keyboard & Mouse", + "label": "Keyboard", + "value": "Built-In Chiclet-Style Keyboard with Backlight" + }, + { + "group": "Keyboard & Mouse", + "label": "Pointing Device", + "value": "Force Touch Trackpad" + }, + { + "group": "General", + "label": "Security", + "value": "Fingerprint Reader" + }, + { + "group": "General", + "label": "Power Supply", + "value": "35 W with Magsafe" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "50 to 95°F / 10 to 35°C at 0 to 90% Humidity" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR" + }, + { + "group": "General", + "label": "Dimensions", + "value": "13.4 x 9.35 x 0.45\" / 34.04 x 23.76 x 1.15 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "3.3 lb / 1.51 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "6.33 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "19.2 x 12.6 x 2.9\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1903737-REG/apple_15_macbook_air_kit.html", + "archive_url": "https://web.archive.org/web/20251021080407/https://www.bhphotovideo.com/c/product/1903737-REG/apple_15_macbook_air_kit.html", + "archive_timestamp": "20251021080407", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "fastset-fast-attach-laptop-tablet-stand", + "name": "FastSet Fast -Attach Laptop/Tablet Stand", + "brand": "FastSet", + "bh_sku": "FASTLAPTOP", + "mpn": "FAST-LAPTOP", + "department_slug": "computers", + "subcategory_slug": "laptops", + "product_type": "Laptop", + "price_usd": 124.99, + "availability": "In Stock", + "condition": "New", + "description": "Position your laptop or tablet anywhere along the back edge of the Fastset table with the Fastset Fast-Attach Laptop/Tablet Stand. With its one-button quick collapse feature, the stand allows for fast and easy setup and returns the tray angle to your preset position every time.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Specifications", + "label": "Adjustable Height", + "value": "2.0 to 13.0\" / 5.1 to 33.0 cm" + }, + { + "group": "Specifications", + "label": "Tray Dimensions", + "value": "9.5 x 8.5\" / 24.1 x 21.6 cm" + }, + { + "group": "Specifications", + "label": "Weight Capacity", + "value": "10.0 lb / 4.5 kg" + }, + { + "group": "Specifications", + "label": "Folded Dimensions (L x W x H)", + "value": "15.8 x 10.8 x 1.0\" / 40.2 x 27.5 x 2.5 cm" + }, + { + "group": "Specifications", + "label": "Weight", + "value": "2.8 lb / 1.3 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "4.185 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "16.9 x 14.3 x 4.1\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1902994-REG/fastset_fast_laptop_fast_attach_laptop_stand.html", + "archive_url": "https://web.archive.org/web/20260220183719/https://www.bhphotovideo.com/c/product/1902994-REG/fastset_fast_laptop_fast_attach_laptop_stand.html", + "archive_timestamp": "20260220183719", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "hp-15-6-victus-15-fa2777nr-gaming-notebook", + "name": "HP 15.6\" Victus 15-fa2777nr Gaming Notebook", + "brand": "HP", + "bh_sku": "HEBM5Y7UA", + "mpn": "BM5Y7UA#ABA", + "department_slug": "computers", + "subcategory_slug": "laptops", + "product_type": "Laptop", + "price_usd": 999.0, + "availability": "In Stock", + "condition": "New", + "description": "Made for gaming on the go, the 15.6\" Victus 15-fa2777nr Gaming Notebook from HP is driven by an Intel Core i7-13620H 10-Core processor and 16GB of 5200 MHz DDR5 memory, which comes in a 1 x 16GB configuration. Its 15.6\" anti-glare IPS display is driven by dedicated NVIDIA GeForce RTX 5050 graphics with 8GB of GDDR7 video memory and displays 1920 x 1080 video with 300 nits of brightness, 62.5% sRGB gamut coverage, and a refresh rate of 144 Hz.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Operating System", + "value": "Windows 11 Home" + }, + { + "group": "Key Specs", + "label": "Processor", + "value": "Intel Core i7-13620H (13th Gen)" + }, + { + "group": "Key Specs", + "label": "GPU", + "value": "NVIDIA GeForce RTX 5050 with 8 GB GDDR7 VRAM" + }, + { + "group": "Key Specs", + "label": "Installed RAM", + "value": "16 GB" + }, + { + "group": "Key Specs", + "label": "Display Size", + "value": "15.6\"" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "1920 x 1080" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Total Capacity", + "value": "512 GB" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "1x USB-C 3.0 / 3.1/3.2 Gen 1 | 2x USB-A 3.0 / 3.1/3.2 Gen 1" + }, + { + "group": "Key Specs", + "label": "Display I/O", + "value": "1x HDMI 2.1" + }, + { + "group": "Key Specs", + "label": "Wi-Fi", + "value": "Wi-Fi 6 (802.11ax)" + }, + { + "group": "Key Specs", + "label": "Bluetooth", + "value": "Bluetooth 5.4" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "5.06 lb / 2.3 kg" + }, + { + "group": "Key Specs", + "label": "Operating System", + "value": "Windows 11 Home" + }, + { + "group": "Performance", + "label": "Processor", + "value": "Intel Core i7-13620H (13th Gen)" + }, + { + "group": "Performance", + "label": "CPU", + "value": "10-Core: | 2.4 to 4.9 GHz Performance (6 Cores) | 1.8 to 3.6 GHz Efficiency (4 Cores)" + }, + { + "group": "Performance", + "label": "Dedicated AI Cores", + "value": "No" + }, + { + "group": "Performance", + "label": "L3 Cache", + "value": "24 MB" + }, + { + "group": "Performance", + "label": "GPU", + "value": "NVIDIA GeForce RTX 5050 with 8 GB GDDR7 VRAM" + }, + { + "group": "Performance", + "label": "Installed RAM", + "value": "16 GB" + }, + { + "group": "Performance", + "label": "RAM Type", + "value": "5200 MT/s DDR5" + }, + { + "group": "Performance", + "label": "RAM Configuration / Capacity", + "value": "1x User-Replaceable 16 GB Module" + }, + { + "group": "Performance", + "label": "vPro Support", + "value": "No" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "IPS-Type LCD" + }, + { + "group": "Display", + "label": "Size", + "value": "15.6\"" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:9" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "1920 x 1080" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Display", + "label": "Finish", + "value": "Anti-Glare" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "300 nits / cd/m2" + }, + { + "group": "Display", + "label": "Color Gamut", + "value": "62.5% sRGB" + }, + { + "group": "Display", + "label": "Refresh Rate", + "value": "144 Hz" + }, + { + "group": "Storage and Expansion", + "label": "Total Capacity", + "value": "512 GB" + }, + { + "group": "Storage and Expansion", + "label": "Storage Drive Type", + "value": "1x 512 GB / M.2 NVMe SSD" + }, + { + "group": "Storage and Expansion", + "label": "Storage Expansion", + "value": "1x M.2 Slot (PCIe 4.0) [Occupied] | 1x M.2 Slot [Available]" + }, + { + "group": "Inputs / Outputs", + "label": "Inputs/Outputs", + "value": "1x USB-C 3.0 / 3.1/3.2 Gen 1 / Supports Video Alt Mode and Power Delivery | 2x USB-A 3.0 / 3.1/3.2 Gen 1" + }, + { + "group": "Inputs / Outputs", + "label": "Display I/O", + "value": "1x HDMI 2.1" + }, + { + "group": "Inputs / Outputs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm Headphone/Microphone Input/Output" + }, + { + "group": "Inputs / Outputs", + "label": "Network I/O", + "value": "1x RJ45 (Gigabit Ethernet)" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Speakers", + "value": "Yes: 2" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Microphones", + "value": "Yes: 2" + }, + { + "group": "Inputs / Outputs", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "Communications", + "label": "Wi-Fi", + "value": "Wi-Fi 6 (802.11ax) with MU-MIMO Support (2 x 2)" + }, + { + "group": "Communications", + "label": "Bluetooth", + "value": "Bluetooth 5.4" + }, + { + "group": "Communications", + "label": "Cellular Support", + "value": "No" + }, + { + "group": "Communications", + "label": "GPS", + "value": "No" + }, + { + "group": "Communications", + "label": "Webcam", + "value": "Yes: User-Facing 720p" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion Polymer (LiPo)" + }, + { + "group": "Battery", + "label": "Capacity", + "value": "4-Cell: 70 Wh" + }, + { + "group": "Keyboard & Mouse", + "label": "Keyboard", + "value": "Built-In Chiclet-Style Keyboard with Number Pad, RGB Backlight" + }, + { + "group": "Keyboard & Mouse", + "label": "Pointing Device", + "value": "TouchPad" + }, + { + "group": "General", + "label": "Security", + "value": "Dedicated Hardware TPM Security Chip" + }, + { + "group": "General", + "label": "Power Supply", + "value": "200 W with Barrel/Proprietary" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR, EPEAT Gold with Climate+" + }, + { + "group": "General", + "label": "Dimensions", + "value": "14.09 x 10.04 x 0.93\" / 35.79 x 25.5 x 2.36 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "5.06 lb / 2.3 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "7.66 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "21.8 x 12.4 x 2.7\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1925489-REG/hp_bm5y7ua_aba_15_6_victus_gaming_laptop.html", + "archive_url": "https://web.archive.org/web/20260807134337/https://www.bhphotovideo.com/c/product/1925489-REG/hp_bm5y7ua_aba_15_6_victus_gaming_laptop.html", + "archive_timestamp": "20260807134337", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "lenovo-14-thinkpad-p14s-gen-6-laptop", + "name": "Lenovo 14\" ThinkPad P14s Gen 6 Laptop", + "brand": "Lenovo", + "bh_sku": "LE21QL0017US", + "mpn": "21QL0017US", + "department_slug": "computers", + "subcategory_slug": "laptops", + "product_type": "Laptop", + "price_usd": 3619.0, + "availability": "In Stock", + "condition": "New", + "description": "Stay productive with the Lenovo 14\" ThinkPad P14s Gen 6 Laptop. Powered by an AMD Ryzen AI 7 PRO 350 8-Core processor, the ThinkPad P14s Gen 6 allows you to harness the power of AI with the built-in AMD Ryzen AI NPU, which provides up to 50 TOPS. The 14\" IPS display features a 1920 x 1200 resolution, powered by integrated AMD Radeon 860M Graphics. Add Wi-Fi 7, Bluetooth 5.4, Thunderbolt 4, HDMI 2.1, Windows 11 Pro, and more, and the ThinkPad P14s Gen 6 delivers performance, power efficiency, and AI features for the home, the office, and anywhere in between.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/le21ql0017us.jpg", + "image_sha256": "57d0d5c179c3d7561f919902bec26822c3ed91c5e53b3d378589c01e662b0757", + "specs": [ + { + "group": "Key Specs", + "label": "Operating System", + "value": "Windows 11 Pro" + }, + { + "group": "Key Specs", + "label": "Processor", + "value": "AMD Ryzen AI 7 PRO 350" + }, + { + "group": "Key Specs", + "label": "GPU", + "value": "AMD Radeon 860M" + }, + { + "group": "Key Specs", + "label": "Installed RAM", + "value": "64 GB" + }, + { + "group": "Key Specs", + "label": "Display Size", + "value": "14\"" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "1920 x 1200" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Total Capacity", + "value": "1 TB" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) | 2x USB-A 3.0 / 3.1/3.2 Gen 1" + }, + { + "group": "Key Specs", + "label": "Display I/O", + "value": "1x HDMI 2.1" + }, + { + "group": "Key Specs", + "label": "Wi-Fi", + "value": "Wi-Fi 7 (802.11be)" + }, + { + "group": "Key Specs", + "label": "Bluetooth", + "value": "Bluetooth 5.4" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "3.02 lb / 1.37 kg" + }, + { + "group": "Key Specs", + "label": "Operating System", + "value": "Windows 11 Pro" + }, + { + "group": "Performance", + "label": "Processor", + "value": "AMD Ryzen AI 7 PRO 350" + }, + { + "group": "Performance", + "label": "CPU", + "value": "8-Core: 2 to 5 GHz" + }, + { + "group": "Performance", + "label": "Dedicated AI Cores", + "value": "Yes" + }, + { + "group": "Performance", + "label": "L3 Cache", + "value": "16 MB" + }, + { + "group": "Performance", + "label": "GPU", + "value": "AMD Radeon 860M" + }, + { + "group": "Performance", + "label": "Installed RAM", + "value": "64 GB" + }, + { + "group": "Performance", + "label": "RAM Type", + "value": "5600 MT/s DDR5" + }, + { + "group": "Performance", + "label": "RAM Configuration / Capacity", + "value": "2x User-Replaceable 32 GB Module / 2 Slots Supporting up to 96 GB (SO-DIMM)" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "IPS-Type LCD" + }, + { + "group": "Display", + "label": "Size", + "value": "14\"" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:10" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "1920 x 1200" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Display", + "label": "Finish", + "value": "Anti-Glare" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "500 nits / cd/m2" + }, + { + "group": "Display", + "label": "Color Gamut", + "value": "100% sRGB" + }, + { + "group": "Display", + "label": "Refresh Rate", + "value": "60 Hz" + }, + { + "group": "Display", + "label": "Variable Refresh Technology", + "value": "No" + }, + { + "group": "Storage and Expansion", + "label": "Total Capacity", + "value": "1 TB" + }, + { + "group": "Storage and Expansion", + "label": "Storage Drive Type", + "value": "1x 1 TB / M.2 NVMe SSD" + }, + { + "group": "Storage and Expansion", + "label": "Storage Expansion", + "value": "Fixed Storage / Cannot Be Upgraded" + }, + { + "group": "Inputs / Outputs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) / Supports Power Delivery | 2x USB-A 3.0 / 3.1/3.2 Gen 1" + }, + { + "group": "Inputs / Outputs", + "label": "Display I/O", + "value": "1x HDMI 2.1" + }, + { + "group": "Inputs / Outputs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm Headphone/Microphone Input/Output" + }, + { + "group": "Inputs / Outputs", + "label": "Network I/O", + "value": "1x RJ45 (Gigabit Ethernet)" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Speakers", + "value": "Yes: 2x 2 W" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Microphones", + "value": "Yes: 2" + }, + { + "group": "Inputs / Outputs", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "Communications", + "label": "Wi-Fi", + "value": "Wi-Fi 7 (802.11be) with MU-MIMO Support (2 x 2)" + }, + { + "group": "Communications", + "label": "Bluetooth", + "value": "Bluetooth 5.4" + }, + { + "group": "Communications", + "label": "Cellular Support", + "value": "No" + }, + { + "group": "Communications", + "label": "GPS", + "value": "No" + }, + { + "group": "Communications", + "label": "Webcam", + "value": "Yes: User-Facing 5 MP" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion Polymer (LiPo)" + }, + { + "group": "Battery", + "label": "Capacity", + "value": "52.5 Wh" + }, + { + "group": "Keyboard & Mouse", + "label": "Keyboard", + "value": "Built-In Chiclet-Style Keyboard with Backlight" + }, + { + "group": "Keyboard & Mouse", + "label": "Pointing Device", + "value": "TouchPad" + }, + { + "group": "General", + "label": "Security", + "value": "Dedicated Hardware TPM Security Chip, Facial Recognition, Fingerprint Reader, Kensington Lock Slot, Webcam Blocker" + }, + { + "group": "General", + "label": "Power Supply", + "value": "65 W with USB-C" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR, ErP, MIL-STD, RoHS, TCO Certified" + }, + { + "group": "General", + "label": "Dimensions", + "value": "12.3 x 8.6 x 0.7\" / 313.6 x 219.4 x 16.9 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "3.02 lb / 1.37 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "4.95 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "17.9 x 12.5 x 2.7\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1908728-REG/lenovo_21ql0017us_14_thinkpad_p14s_gen.html", + "archive_url": "https://web.archive.org/web/20260708213955/https://www.bhphotovideo.com/c/product/1908728-REG/lenovo_21ql0017us_14_thinkpad_p14s_gen.html", + "archive_timestamp": "20260708213955", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "lenovo-14-thinkpad-x1-carbon-gen-13-laptop", + "name": "Lenovo 14\" ThinkPad X1 Carbon Gen 13 Laptop", + "brand": "Lenovo", + "bh_sku": "LE21NYS2WQ00", + "mpn": "21NYS2WQ00", + "department_slug": "computers", + "subcategory_slug": "laptops", + "product_type": "Laptop", + "price_usd": 1379.0, + "availability": "In Stock", + "condition": "New", + "description": "With performance, power efficiency, and enhanced security, the Lenovo 14\" ThinkPad X1 Carbon Gen 13 Laptop empowers professionals to stay productive and connected no matter where their work takes them. Powered by an Intel Core Ultra 7 processor with a built-in Intel AI Boost NPU, the ThinkPad X1 can effortlessly tackle complex tasks, such as processing large datasets and running CPU-intensive apps. Add 16GB of onboard LPDDR5X RAM, and a 1TB M.2 NVMe PCIe SSD, and the ThinkPad X1 can handle your workflow with ease.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Operating System", + "value": "Windows 11 Pro" + }, + { + "group": "Key Specs", + "label": "Processor", + "value": "Intel Core Ultra 7 255U" + }, + { + "group": "Key Specs", + "label": "GPU", + "value": "Intel Graphics" + }, + { + "group": "Key Specs", + "label": "Installed RAM", + "value": "16 GB" + }, + { + "group": "Key Specs", + "label": "Display Size", + "value": "14\"" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "1920 x 1200" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Total Installed Storage", + "value": "1 TB" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) | 2x USB-A 3.0 / 3.1/3.2 Gen 1" + }, + { + "group": "Key Specs", + "label": "Display I/O", + "value": "1x HDMI 2.1 Output" + }, + { + "group": "Key Specs", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax)" + }, + { + "group": "Key Specs", + "label": "Bluetooth", + "value": "Bluetooth 5.3" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "2.42 lb / 1.1 kg" + }, + { + "group": "Key Specs", + "label": "Operating System", + "value": "Windows 11 Pro" + }, + { + "group": "Performance", + "label": "Processor", + "value": "Intel Core Ultra 7 255U" + }, + { + "group": "Performance", + "label": "CPU", + "value": "12-Core: | 2 to 5.2 GHz Performance (2 Cores) | 1.7 to 4.2 GHz Efficiency (8 Cores) | 0.7 to 2.4 GHz Performance (2 Cores)" + }, + { + "group": "Performance", + "label": "Dedicated AI Cores", + "value": "Yes: 12 TOPS" + }, + { + "group": "Performance", + "label": "L3 Cache", + "value": "12 MB" + }, + { + "group": "Performance", + "label": "GPU", + "value": "Intel Graphics" + }, + { + "group": "Performance", + "label": "Installed RAM", + "value": "16 GB" + }, + { + "group": "Performance", + "label": "RAM Type", + "value": "8400 MT/s LPDDR5x" + }, + { + "group": "Performance", + "label": "RAM Configuration / Capacity", + "value": "Onboard Only/Not Upgradeable" + }, + { + "group": "Performance", + "label": "vPro Support", + "value": "No" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "IPS-Type LCD" + }, + { + "group": "Display", + "label": "Size", + "value": "14\"" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:10" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "1920 x 1200" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Display", + "label": "Finish", + "value": "Anti-Glare" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "500 nits / cd/m2" + }, + { + "group": "Display", + "label": "Refresh Rate", + "value": "60 Hz" + }, + { + "group": "Display", + "label": "Variable Refresh Technology", + "value": "No" + }, + { + "group": "Storage and Expansion", + "label": "Total Installed Storage", + "value": "1 TB" + }, + { + "group": "Storage and Expansion", + "label": "Storage Drive Type", + "value": "1x 1 TB / M.2 NVMe SSD" + }, + { + "group": "Storage and Expansion", + "label": "Storage Expansion", + "value": "1x M.2 Slot 2280 [Occupied]" + }, + { + "group": "Inputs / Outputs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 4) / Supports Power Delivery | 2x USB-A 3.0 / 3.1/3.2 Gen 1" + }, + { + "group": "Inputs / Outputs", + "label": "Display I/O", + "value": "1x HDMI 2.1 Output" + }, + { + "group": "Inputs / Outputs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm Headphone/Microphone Input/Output" + }, + { + "group": "Inputs / Outputs", + "label": "Network I/O", + "value": "No" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Speakers", + "value": "Yes: 2x 2 W" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Microphones", + "value": "Yes" + }, + { + "group": "Inputs / Outputs", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "Communications", + "label": "Wi-Fi", + "value": "Wi-Fi 6E (802.11ax) with MU-MIMO Support (2 x 2)" + }, + { + "group": "Communications", + "label": "Bluetooth", + "value": "Bluetooth 5.3" + }, + { + "group": "Communications", + "label": "Cellular Support", + "value": "No" + }, + { + "group": "Communications", + "label": "GPS", + "value": "No" + }, + { + "group": "Communications", + "label": "Webcam", + "value": "Yes: User-Facing 1080p" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion" + }, + { + "group": "Battery", + "label": "Capacity", + "value": "3-Cell: 57 Wh" + }, + { + "group": "Keyboard & Mouse", + "label": "Keyboard", + "value": "Built-In Chiclet-Style Keyboard with Backlight" + }, + { + "group": "Keyboard & Mouse", + "label": "Pointing Device", + "value": "TouchPad" + }, + { + "group": "General", + "label": "Security", + "value": "Facial Recognition, Fingerprint Reader, Webcam Blocker" + }, + { + "group": "General", + "label": "Power Supply", + "value": "65 W with USB-C" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR, EPEAT" + }, + { + "group": "General", + "label": "Dimensions", + "value": "12.3 x 8.45 x 0.57\" / 312.8 x 214.75 x 14.37 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "2.42 lb / 1.1 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "4.26 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "17.6 x 11.4 x 2.9\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1932807-REG/lenovo_21nys2wq00_14_thinkpad_x1_carbon.html", + "archive_url": "https://web.archive.org/web/20260216220818/https://www.bhphotovideo.com/c/product/1932807-REG/lenovo_21nys2wq00_14_thinkpad_x1_carbon.html", + "archive_timestamp": "20260216220818", + "fetched_at": "2026-09-12T17:27:30Z" + } + }, + { + "slug": "lenovo-16-thinkpad-t1g-gen-8-multi-touch-laptop", + "name": "Lenovo 16\" ThinkPad T1g Gen 8 Multi-Touch Laptop", + "brand": "Lenovo", + "bh_sku": "LE21TD000VUS", + "mpn": "21TD000VUS", + "department_slug": "computers", + "subcategory_slug": "laptops", + "product_type": "Laptop", + "price_usd": 7109.0, + "availability": "In Stock", + "condition": "New", + "description": "Engineered for those constantly on the move, the Lenovo 16\" ThinkPad T1g Gen 8 Multi-Touch Laptop empowers professionals with powerful performance. At its core is an Intel Core Ultra 9 285H 16-Core processor, which can handle demanding workflows with ease, while the built-in Intel AI Boost NPU accelerates tasks with up to 13 TOPS. Multitasking flows smoothy with 64GB of LPDDR5X RAM while boot times are improved with the 2TB M.2 NVMe SSD.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/le21td000vus.jpg", + "image_sha256": "82efbdffd46aaac30225855832ca114d7db54c92399f564ff93e3ac7b0f32ac0", + "specs": [ + { + "group": "Key Specs", + "label": "Operating System", + "value": "Windows 11 Pro" + }, + { + "group": "Key Specs", + "label": "Processor", + "value": "Intel Core Ultra 9 285H" + }, + { + "group": "Key Specs", + "label": "GPU", + "value": "NVIDIA GeForce RTX 5070 with 8 GB GDDR7 VRAM" + }, + { + "group": "Key Specs", + "label": "Installed RAM", + "value": "64 GB" + }, + { + "group": "Key Specs", + "label": "Display Size", + "value": "16\"" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "3200 x 2000" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "Yes" + }, + { + "group": "Key Specs", + "label": "Total Capacity", + "value": "2 TB" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 5) | 1x USB-C (Thunderbolt 4) | 1x USB-A 3.1/3.2 Gen 2" + }, + { + "group": "Key Specs", + "label": "Display I/O", + "value": "1x HDMI 2.1 Output" + }, + { + "group": "Key Specs", + "label": "Wi-Fi", + "value": "Wi-Fi 7 (802.11be)" + }, + { + "group": "Key Specs", + "label": "Bluetooth", + "value": "Bluetooth 5.4" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "4.06 lb / 1.84 kg" + }, + { + "group": "Key Specs", + "label": "Operating System", + "value": "Windows 11 Pro" + }, + { + "group": "Performance", + "label": "Processor", + "value": "Intel Core Ultra 9 285H" + }, + { + "group": "Performance", + "label": "CPU", + "value": "16-Core: | 2.9 to 5.4 GHz Performance (6 Cores) | 2.7 to 4.5 GHz Efficiency (8 Cores) | 1 to 2.5 GHz Low Power Efficiency (2 Cores)" + }, + { + "group": "Performance", + "label": "Dedicated AI Cores", + "value": "Yes: 13 TOPS" + }, + { + "group": "Performance", + "label": "L3 Cache", + "value": "24 MB" + }, + { + "group": "Performance", + "label": "GPU", + "value": "NVIDIA GeForce RTX 5070 with 8 GB GDDR7 VRAM" + }, + { + "group": "Performance", + "label": "Installed RAM", + "value": "64 GB" + }, + { + "group": "Performance", + "label": "RAM Type", + "value": "7467 MT/s LPDDR5x" + }, + { + "group": "Performance", + "label": "RAM Configuration / Capacity", + "value": "1x User-Replaceable 64 GB Module / 1 Slots Supporting up to 64 GB (LPCAMM2)" + }, + { + "group": "Performance", + "label": "vPro Support", + "value": "Yes" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "OLED" + }, + { + "group": "Display", + "label": "Size", + "value": "16\"" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:10" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "3200 x 2000" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "Yes" + }, + { + "group": "Display", + "label": "Finish", + "value": "Anti-Glare" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "600 nits / cd/m2" + }, + { + "group": "Display", + "label": "Color Gamut", + "value": "100% DCI-P3" + }, + { + "group": "Display", + "label": "Refresh Rate", + "value": "120 Hz" + }, + { + "group": "Storage and Expansion", + "label": "Total Capacity", + "value": "2 TB" + }, + { + "group": "Storage and Expansion", + "label": "Storage Drive Type", + "value": "1x 2 TB / M.2 NVMe SSD" + }, + { + "group": "Storage and Expansion", + "label": "Storage Expansion", + "value": "1x M.2 Slot 2280 (PCIe 5.0 x4) [Occupied] | 1x M.2 Slot 2280 (PCIe 5.0 x4) [Available]" + }, + { + "group": "Inputs / Outputs", + "label": "Inputs/Outputs", + "value": "2x USB-C (Thunderbolt 5) / Supports Power Delivery (15 W) | 1x USB-C (Thunderbolt 4) / Supports Power Delivery (15 W) | 1x USB-A 3.1/3.2 Gen 2" + }, + { + "group": "Inputs / Outputs", + "label": "Display I/O", + "value": "1x HDMI 2.1 Output" + }, + { + "group": "Inputs / Outputs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm Headphone/Microphone Input/Output" + }, + { + "group": "Inputs / Outputs", + "label": "Network I/O", + "value": "No" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Speakers", + "value": "Yes: 2x 2 W" + }, + { + "group": "Inputs / Outputs", + "label": "Built-In Microphones", + "value": "Yes: 2" + }, + { + "group": "Inputs / Outputs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD (Unspecified Type)" + }, + { + "group": "Communications", + "label": "Wi-Fi", + "value": "Wi-Fi 7 (802.11be) with MU-MIMO Support (2 x 2)" + }, + { + "group": "Communications", + "label": "Bluetooth", + "value": "Bluetooth 5.4" + }, + { + "group": "Communications", + "label": "Cellular Support", + "value": "No" + }, + { + "group": "Communications", + "label": "GPS", + "value": "No" + }, + { + "group": "Communications", + "label": "Webcam", + "value": "Yes: User-Facing 5 MP" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion Polymer (LiPo)" + }, + { + "group": "Battery", + "label": "Capacity", + "value": "90 Wh" + }, + { + "group": "Keyboard & Mouse", + "label": "Keyboard", + "value": "Built-In Chiclet-Style Keyboard with Backlight" + }, + { + "group": "Keyboard & Mouse", + "label": "Pointing Device", + "value": "TouchPad" + }, + { + "group": "General", + "label": "Security", + "value": "Facial Recognition, Fingerprint Reader, Kensington Lock Slot, Webcam Blocker" + }, + { + "group": "General", + "label": "Power Supply", + "value": "140 W with USB-C" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR 9.0, EPEAT Gold Registered, MIL-STD 810H, RoHS, TCO Certified Gen 10, TUV Rheinland Low Blue Light" + }, + { + "group": "General", + "label": "Dimensions", + "value": "13.95 x 9.49 x 0.8\" / 35.43 x 24.1 x 2 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "4.06 lb / 1.84 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "6.74 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "20.4 x 13 x 3\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1922655-REG/lenovo_21td000vus_16_thinkpad_t1g_g8.html", + "archive_url": "https://web.archive.org/web/20260708182155/https://www.bhphotovideo.com/c/product/1922655-REG/lenovo_21td000vus_16_thinkpad_t1g_g8.html", + "archive_timestamp": "20260708182155", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "atomos-sunhood-for-shogun-7-monitor-black", + "name": "Atomos Sunhood for Shogun 7\" Monitor (Black)", + "brand": "Atomos", + "bh_sku": "ATOMSUN008", + "mpn": "ATOMSUN008", + "department_slug": "computers", + "subcategory_slug": "monitors", + "product_type": "Monitor", + "price_usd": 109.99, + "availability": "In Stock", + "condition": "New", + "description": "When monitoring in harsh lighting conditions, this black Sunhood from Atomos for the Shogun 7\" monitor will block excess reflections and glare from washing out the displayed image. This is especially important when viewing HDR imagery, which naturally uses a larger contrast range, and can easily be overpowered by glare.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Specifications", + "label": "Dimensions", + "value": "Not Specified by Manufacturer" + }, + { + "group": "Specifications", + "label": "Weight", + "value": "Not Specified by Manufacturer" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.55 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "12.9 x 5.5 x 1.6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1507253-REG/atomos_atomsun008_sunhood_for_shogun_7.html", + "archive_url": "https://web.archive.org/web/20250122135557/https://www.bhphotovideo.com/c/product/1507253-REG/atomos_atomsun008_sunhood_for_shogun_7.html", + "archive_timestamp": "20250122135557", + "fetched_at": "2026-09-12T17:27:26Z" + } + }, + { + "slug": "dell-21-5-p2225h-monitor-10-pack", + "name": "Dell 21.5\" P2225H Monitor (10-Pack)", + "brand": "Dell", + "bh_sku": "DEP2225H10K", + "mpn": null, + "department_slug": "computers", + "subcategory_slug": "monitors", + "product_type": "Monitor", + "price_usd": 1549.99, + "availability": "In Stock", + "condition": "New", + "description": "Quickly outfit your office with this Dell 21.5\" P2225H Monitor 10-pack from B&H. This convenient bundle allows you to set up 10 single-display workstations or five dual-monitor configurations.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Display Size", + "value": "21.5\"" + }, + { + "group": "Key Specs", + "label": "Panel Type", + "value": "IPS-Type LCD" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "1920 x 1080" + }, + { + "group": "Key Specs", + "label": "Maximum Brightness", + "value": "250 nits / cd/m2" + }, + { + "group": "Key Specs", + "label": "HDR Support", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Color Support", + "value": "16.7 Million Colors (8-Bit)" + }, + { + "group": "Key Specs", + "label": "Color Gamut", + "value": "99% sRGB" + }, + { + "group": "Key Specs", + "label": "Finish", + "value": "Anti-Glare" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Key Specs", + "label": "A/V Inputs", + "value": "1x HDMI 1.4 | 1x DisplayPort 1.2 | 1x DE-15/DB-15 (VGA)" + }, + { + "group": "Key Specs", + "label": "USB I/O", + "value": "2x USB-A 3.0 / 3.1/3.2 Gen 1 | 1x USB-B 3.0 / 3.1/3.2 Gen 1 | 1x USB-C 3.0 / 3.1/3.2 Gen 1 with USB PD 15 W [Charging] | 1x USB-A 3.0 / 3.1/3.2 Gen 1" + }, + { + "group": "Key Specs", + "label": "Built-In Speakers", + "value": "No" + }, + { + "group": "Display", + "label": "Display Size", + "value": "21.5\"" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "IPS-Type LCD" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:9" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "1920 x 1080" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "250 nits / cd/m2" + }, + { + "group": "Display", + "label": "HDR Support", + "value": "No" + }, + { + "group": "Display", + "label": "Contrast Ratio", + "value": "1500:1" + }, + { + "group": "Display", + "label": "Response Time", + "value": "5 ms (Overdrive) | 8 ms (GtG)" + }, + { + "group": "Display", + "label": "Refresh Rate", + "value": "100 Hz" + }, + { + "group": "Display", + "label": "Variable Refresh Technology", + "value": "No" + }, + { + "group": "Display", + "label": "Color Support", + "value": "16.7 Million Colors (8-Bit)" + }, + { + "group": "Display", + "label": "Color Gamut", + "value": "99% sRGB" + }, + { + "group": "Display", + "label": "Viewing Angle (H x V)", + "value": "178 x 178°" + }, + { + "group": "Display", + "label": "Curved Display", + "value": "No" + }, + { + "group": "Display", + "label": "Finish", + "value": "Anti-Glare" + }, + { + "group": "Surface", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Connectivity", + "label": "A/V Inputs", + "value": "1x HDMI 1.4 | 1x DisplayPort 1.2 | 1x DE-15/DB-15 (VGA)" + }, + { + "group": "Connectivity", + "label": "HDCP Support", + "value": "Yes: Version 1.4" + }, + { + "group": "Connectivity", + "label": "USB I/O", + "value": "2x USB-A 3.0 / 3.1/3.2 Gen 1 | 1x USB-B 3.0 / 3.1/3.2 Gen 1 | 1x USB-C 3.0 / 3.1/3.2 Gen 1 with USB PD 15 W [Charging] | 1x USB-A 3.0 / 3.1/3.2 Gen 1" + }, + { + "group": "Connectivity", + "label": "Multi-Input Support (PIP/PBP)", + "value": "No" + }, + { + "group": "Speaker", + "label": "Built-In Speakers", + "value": "No" + }, + { + "group": "Electrical", + "label": "Power Consumption", + "value": "Maximum: 60.0 W" + }, + { + "group": "Electrical", + "label": "Input Power", + "value": "100 to 240 VAC, 60 / 50 Hz at 1.5 A" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C at 10 to 80% Humidity" + }, + { + "group": "General", + "label": "Storage Conditions", + "value": "-4 to 140°F / -20 to 60°C at 5 to 90% Humidity" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR, EPEAT GOLD, EPEAT Climate+, RoHS, TCO Certified, TUV" + }, + { + "group": "General", + "label": "Adjustments", + "value": "Height 5.9\" / 15 cm | Tilt 26° (-5 to 21°) | Swivel 90° (-45 to 45°)" + }, + { + "group": "General", + "label": "VESA Mounting-Hole Pattern", + "value": "100 x 100 mm" + }, + { + "group": "General", + "label": "Lock Slot", + "value": "Yes: Kensington" + }, + { + "group": "General", + "label": "Dimensions", + "value": "19.2 x 19 x 7.2\" / 48.8 x 48.3 x 18.2 cm (with Stand) | 19.2 x 11.3 x 2\" / 48.8 x 28.7 x 5.1 cm (without Stand)" + }, + { + "group": "General", + "label": "Weight", + "value": "5.69 lb / 2.58 kg (without Stand)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "13.365 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "22.4 x 15.8 x 6.4\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1918362-REG/dell_21_5_p2225h_monitor_10_pack.html", + "archive_url": "https://web.archive.org/web/20251028232146/https://www.bhphotovideo.com/c/product/1918362-REG/dell_21_5_p2225h_monitor_10_pack.html", + "archive_timestamp": "20251028232146", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "genelec-8341a-sam-studio-monitor-raw-finish", + "name": "Genelec 8341A SAM Studio Monitor (Raw Finish)", + "brand": "Genelec", + "bh_sku": "GE8341ARW", + "mpn": "8341ARW", + "department_slug": "computers", + "subcategory_slug": "monitors", + "product_type": "Monitor", + "price_usd": 3350.0, + "availability": "In Stock", + "condition": "New", + "description": "Styled in a finish dubbed \"raw\" by this item's manufacturers, the Genelec 8341A is a point-source monitor meant for near-field applications in the realm of pro audio. It features a coaxial design which nestles driver and tweeter—as well as two 6.6” woofers—in one location, thus aligning their acoustical axes, and securing an accurate point of sonic radiation. It’s also worth noting the 8341A’s Intelligent Signal Sensing technology, as well as the connections this technology affords you: ISS automatically detects whether analog or digital sources are being run into the monitor and allows the speaker to produce sound accordingly. To put it another way, one XLR input accepts analog signals, the other XLR takes AES/EBU, and the monitor itself automatically selects the input source.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": "No", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Monitor Type & Configuration", + "value": "Active 3-Way" + }, + { + "group": "Key Specs", + "label": "Total Power Output", + "value": "550 W" + }, + { + "group": "Key Specs", + "label": "Tweeter", + "value": "1x 0.7\" / 19 mm Metal Dome" + }, + { + "group": "Key Specs", + "label": "Midrange", + "value": "1x 3.5\" / 9 cm Cone" + }, + { + "group": "Key Specs", + "label": "Woofer", + "value": "2x 6.7\" / 17 cm Oval Cone |" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x XLR 3-Pin Balanced Input (10 Kilohms)" + }, + { + "group": "Key Specs", + "label": "Digital Audio I/O", + "value": "1x XLR 3-Pin AES3 Input | 1x XLR 3-Pin AES3 Output" + }, + { + "group": "Key Specs", + "label": "Network I/O", + "value": "2x RJ45 Ethernet" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Number of Included Monitors", + "value": "Single Monitor" + }, + { + "group": "Key Specs", + "label": "Enclosure", + "value": "Bass-Reflex/Ported, Shielded" + }, + { + "group": "Key Specs", + "label": "Total Power Output", + "value": "550 W" + }, + { + "group": "Drivers", + "label": "Tweeter", + "value": "1x 0.7\" / 19 mm Metal Dome" + }, + { + "group": "Drivers", + "label": "Midrange", + "value": "1x 3.5\" / 9 cm Cone" + }, + { + "group": "Drivers", + "label": "Woofer", + "value": "2x 6.7\" / 17 cm Oval Cone |" + }, + { + "group": "Drivers", + "label": "Amplifiers", + "value": "HF: 150 W | MF: 150 W | LF: 250 W" + }, + { + "group": "Performance", + "label": "Frequency Response", + "value": "45 Hz to 20 kHz ± 1.5 dB" + }, + { + "group": "Performance", + "label": "Maximum Sound Pressure Level (SPL)", + "value": "118 dB" + }, + { + "group": "Performance", + "label": "Total Harmonic Distortion (THD)", + "value": "0.05%" + }, + { + "group": "Performance", + "label": "Maximum Input Level", + "value": "+24 dBu" + }, + { + "group": "Performance", + "label": "Analog Input Sensitivity/Gain", + "value": "+36 to -6 dBu (Continuously Variable)" + }, + { + "group": "Performance", + "label": "Protections and Limiting", + "value": "Driver Protection" + }, + { + "group": "Signal Processing", + "label": "EQ", + "value": "1x HF Tilt: -4 to +2 dB at 5 kHz | 1x LF Tilt: -6 to -2 dB at 800 Hz (2 dB Increments)" + }, + { + "group": "Signal Processing", + "label": "Filters", + "value": "2 x High-Pass at 38 Hz | 2 x Low-Pass at 37 kHz | 16 x Parametric Notch Filter" + }, + { + "group": "Signal Processing", + "label": "Crossover Frequency", + "value": "Low-Pass: 500 Hz | High-Pass: 3 kHz" + }, + { + "group": "Connectivity", + "label": "Audio I/O", + "value": "1x XLR 3-Pin Balanced Input (10 Kilohms)" + }, + { + "group": "Connectivity", + "label": "Digital Audio I/O", + "value": "1x XLR 3-Pin AES3 Input | 1x XLR 3-Pin AES3 Output" + }, + { + "group": "Connectivity", + "label": "Network I/O", + "value": "2x RJ45 Ethernet" + }, + { + "group": "Connectivity", + "label": "USB", + "value": "No" + }, + { + "group": "Connectivity", + "label": "Wireless", + "value": "No" + }, + { + "group": "Power", + "label": "AC Input Power", + "value": "100 to 240 VAC, 50/60 Hz" + }, + { + "group": "Power", + "label": "Power Consumption", + "value": "0.5 W (Standby) | 16 W (Idle) | 250 W (Maximum)" + }, + { + "group": "Physical", + "label": "Color", + "value": "Raw Silver" + }, + { + "group": "Physical", + "label": "Monitor Orientation", + "value": "Vertical" + }, + { + "group": "Physical", + "label": "Enclosure Material", + "value": "Aluminum" + }, + { + "group": "Physical", + "label": "Mounting Points", + "value": "2x M6 (Rear Panel) | 1x M10 (Bottom Panel)" + }, + { + "group": "Physical", + "label": "Dimensions (W x H x D)", + "value": "9.3 x 13.8 x 9.6\" / 237 x 351 x 243 mm" + }, + { + "group": "Physical", + "label": "Weight", + "value": "21.6 lb / 9.8 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "26.21 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "23.1 x 12.5 x 12.4\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1707724-REG/genelec_8341arw_8341_sam_monitor_raw.html", + "archive_url": "https://web.archive.org/web/20250912001516/https://www.bhphotovideo.com/c/product/1707724-REG/genelec_8341arw_8341_sam_monitor_raw.html", + "archive_timestamp": "20250912001516", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "inovativ-pro-monitor-mount", + "name": "Inovativ Pro Monitor Mount", + "brand": "Inovativ", + "bh_sku": "INPMM", + "mpn": "501-600", + "department_slug": "computers", + "subcategory_slug": "monitors", + "product_type": "Monitor", + "price_usd": 229.0, + "availability": "In Stock", + "condition": "New", + "description": "The INOVATIV Pro Monitor Mount mounts on industry standard 5/8\" (Baby) pins and supports monitors with a 100 x 100 VESA mounting pattern. The sturdy mount is made from 6061 aluminum and stainless steel components and is anodized black and orange. The design of the mount allows you to freely rotate the monitor and lock it in either horizontal or vertical orientation. The mount also features a lockable-tilt axis.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/inpmm.jpg", + "image_sha256": "5fbcf674bfc120188b5235cb6f173a93d7c270defae3fb71203dd814d33dec17", + "specs": [ + { + "group": "Specifications", + "label": "Material of Construction", + "value": "Anodized 6061 Aluminum" + }, + { + "group": "Specifications", + "label": "Mounting", + "value": "5/8\" (Baby) Pin | \n100 x 100 mm VESA Pattern" + }, + { + "group": "Specifications", + "label": "Accessory Mount Thread", + "value": "1 x 3/8\"-16" + }, + { + "group": "Specifications", + "label": "Dimensions", + "value": "5.3 x 5 x 4.5\" / 13.46 x 12.7 x 11.43 cm" + }, + { + "group": "Specifications", + "label": "Weight", + "value": "4 lb / 1.81 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.95 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "10.25 x 6.75 x 4.25\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1507333-REG/inovativ_501_600_pro_monitor_mount.html", + "archive_url": "https://web.archive.org/web/20250130044315/https://www.bhphotovideo.com/c/product/1507333-REG/inovativ_501_600_pro_monitor_mount.html", + "archive_timestamp": "20250130044315", + "fetched_at": "2026-09-12T17:27:26Z" + } + }, + { + "slug": "wooden-camera-mini-monitor-hinge-for-canon-c300-mark-iii-and-c500-mark-ii", + "name": "Wooden Camera Mini Monitor Hinge for Canon C300 Mark III and C500 Mark II", + "brand": "Wooden Camera", + "bh_sku": "WO282500", + "mpn": "282500", + "department_slug": "computers", + "subcategory_slug": "monitors", + "product_type": "Monitor", + "price_usd": 145.0, + "availability": "In Stock", + "condition": "New", + "description": "Mount your Canon C300 Mark III or C500 Mark II LCD onto the top handle, microphone mount, or camera body with this Mini Monitor Hinge from Wooden Camera. This low-profile hinge mount installs onto the camera body using a captive 1/4\"-20 screw and provides a rotating, adjustable mount for your Canon LCD.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Specifications", + "label": "Mounting", + "value": "1 x 1/4\"-20 Captive Screw" + }, + { + "group": "Specifications", + "label": "Accessory Mounting Thread", + "value": "1 x 3/8\"-16" + }, + { + "group": "Specifications", + "label": "Dimensions", + "value": "3.75 x 4.25 x 1.25\" / 95.25 x 107.95 x 31.75 mm" + }, + { + "group": "Specifications", + "label": "Weight", + "value": "2.9 oz / 82 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.22 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "4.6 x 3.95 x 1.4\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1605426-REG/wooden_camera_282500_mini_monitor_hinge_for.html", + "archive_url": "https://web.archive.org/web/20250512224050/https://www.bhphotovideo.com/c/product/1605426-REG/wooden_camera_282500_mini_monitor_hinge_for.html", + "archive_timestamp": "20250512224050", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "brother-ads-4900w-high-speed-wireless-desktop-scanner", + "name": "Brother ADS-4900W High-Speed Wireless Desktop Scanner", + "brand": "Brother", + "bh_sku": "BRADS4900W", + "mpn": "ADS-4900W", + "department_slug": "computers", + "subcategory_slug": "printers-scanners", + "product_type": "Printer", + "price_usd": 799.99, + "availability": "In Stock", + "condition": "New", + "description": "The Brother ADS-4900W High-Speed Wireless Desktop Scanner is a compact solution with a 100-page auto document feeder (ADF) and 9000-page daily duty cycle. It scans in up to 600 x 600 dpi optical scan resolution. The ADS-4900W features USB Type-B and Type-A ports, Ethernet connectivity, and built-in dual-band Wi-Fi. This versatility allows you to send scans to your computer, to an optional USB memory stick, to your network, or to AirPrint, Brother Mobile Connect, and Wi-Fi Direct mobile print services.", + "mount_type": null, + "sensor_size": "2x Contact Image Sensor (CIS)", + "focal_length": null, + "connectivity": "Wi-Fi", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Scanner Type", + "value": "Automatic Document Feeder (ADF)" + }, + { + "group": "Key Specs", + "label": "Scanner Maximum Resolution", + "value": "600 dpi (Optical) | 1200 x 1200 dpi (Interpolated)" + }, + { + "group": "Key Specs", + "label": "Scanner Color Depth", + "value": "24-Bit (Internal)" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Wi-Fi" + }, + { + "group": "Key Specs", + "label": "Power Source", + "value": "AC Adapter (Included)" + }, + { + "group": "Scanner", + "label": "Scanner Type", + "value": "Automatic Document Feeder (ADF)" + }, + { + "group": "Scanner", + "label": "Scanner Maximum Resolution", + "value": "600 dpi (Optical) | 1200 x 1200 dpi (Interpolated)" + }, + { + "group": "Scanner", + "label": "Scan Modes", + "value": "Color, Grayscale, Monochrome" + }, + { + "group": "Scanner", + "label": "Scanner Color Depth", + "value": "24-Bit (Internal)" + }, + { + "group": "Scanner", + "label": "Grayscale Depth", + "value": "8-Bit (Internal)" + }, + { + "group": "Scanner", + "label": "Image Sensor", + "value": "2x Contact Image Sensor (CIS)" + }, + { + "group": "Scanner", + "label": "Duplex Scanning", + "value": "Yes" + }, + { + "group": "Scanner", + "label": "Single Pass Duplex", + "value": "Yes" + }, + { + "group": "Scanner", + "label": "Scan Speed", + "value": "Duplex Speed | 120 ipm in Color/Black & White | Simplex Speed | 60 ppm in Color/Black & White" + }, + { + "group": "Scanner", + "label": "Automatic Image Corrections", + "value": "Yes" + }, + { + "group": "Scanner Media Handling", + "label": "Scan Sizes", + "value": "ADF | Minimum: 2 x 2\" / 5.1 x 5.1 cm | Maximum: 8.5 x 14\" / 21.6 x 35.6 cm" + }, + { + "group": "Scanner Media Handling", + "label": "Paper Capacity", + "value": "ADF: 100x Sheet" + }, + { + "group": "Scanner Media Handling", + "label": "Media Weight", + "value": "7 to 110 lb" + }, + { + "group": "Scanner Media Handling", + "label": "Daily Duty Cycle", + "value": "9000 Scans" + }, + { + "group": "Connectivity", + "label": "Data I/O", + "value": "1x USB-B 3.0 / 3.1/3.2 Gen 1 Input | 1x USB-A 2.0 Output (Flash Drive Only) | 1x RJ45 Input" + }, + { + "group": "Connectivity", + "label": "Wireless", + "value": "Wi-Fi" + }, + { + "group": "Connectivity", + "label": "Scanner Drivers", + "value": "TWAIN, WIA, ISIS, SANE" + }, + { + "group": "Connectivity", + "label": "OS Compatibility", + "value": "Windows / macOS" + }, + { + "group": "General", + "label": "Display Size", + "value": "4.3\"" + }, + { + "group": "General", + "label": "Display Type", + "value": "Color Touchscreen LCD" + }, + { + "group": "General", + "label": "Power Source", + "value": "AC Adapter (Included)" + }, + { + "group": "General", + "label": "Battery", + "value": "No" + }, + { + "group": "General", + "label": "Power Consumption", + "value": "34 W (Maximum) | 7.7 W (Ready) | 1.7 W (Sleep)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "41 to 95°F / 5 to 35°C at 20 to 80% Humidity" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR, EPEATSilver" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "11.6 x 9.2 x 7\" / 29.5 x 23.4 x 17.8 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "7.8 lb / 3.5 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "11.5 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "15.1 x 13.2 x 11.4\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1706135-REG/brother_ads_4900w_high_speed_desktop_scanner.html", + "archive_url": "https://web.archive.org/web/20250826202653/https://www.bhphotovideo.com/c/product/1706135-REG/brother_ads_4900w_high_speed_desktop_scanner.html", + "archive_timestamp": "20250826202653", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "brother-sp1-sublimation-printer", + "name": "Brother SP1 Sublimation Printer", + "brand": "Brother", + "bh_sku": "BRSP1", + "mpn": "SP1", + "department_slug": "computers", + "subcategory_slug": "printers-scanners", + "product_type": "Printer", + "price_usd": 429.99, + "availability": "In Stock", + "condition": "New", + "description": "The SP1 Sublimation Printer from Brother is the perfect companion for artists when creating color projects on ceramic mugs, t-shirts, metal tumblers, tote bags, and hats. Using Artspira, Brother's editing and design app, users can create most designs from the comfort of their mobile device. The printer includes a full-size set of Brother Genuine Ink cartridges and sheets of sublimation paper to get you started. \r\n\r\nPlease note that a heat press is required to operate the printer, which requires an additional purchase.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": "Wi-Fi | *Via Included Adapter", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Functions", + "value": "Print" + }, + { + "group": "Key Specs", + "label": "Printing Technology", + "value": "Inkjet" + }, + { + "group": "Key Specs", + "label": "Color Type", + "value": "Color" + }, + { + "group": "Key Specs", + "label": "Print Resolution", + "value": "1200 x 2400 dpi" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Wi-Fi | *Via Included Adapter" + }, + { + "group": "Key Specs", + "label": "Power Source", + "value": "AC Adapter (Included)" + }, + { + "group": "Printer", + "label": "Printing Technology", + "value": "Inkjet" + }, + { + "group": "Printer", + "label": "Color Type", + "value": "Color" + }, + { + "group": "Printer", + "label": "Ink Palette", + "value": "CMYK" + }, + { + "group": "Printer", + "label": "Print Resolution", + "value": "1200 x 2400 dpi" + }, + { + "group": "Printer", + "label": "Duplex Printing", + "value": "No" + }, + { + "group": "Printer Media Handling", + "label": "Supported Media", + "value": "Sheet" + }, + { + "group": "Printer Media Handling", + "label": "Media Handling", + "value": "1 x Input Tray, Manual Feed, Output Bin" + }, + { + "group": "Printer Media Handling", + "label": "Margins", + "value": "No" + }, + { + "group": "Connectivity", + "label": "Data I/O", + "value": "1x USB-C 2.0 Input | 1x RJ45 Input" + }, + { + "group": "Connectivity", + "label": "Wireless", + "value": "Wi-Fi | *Via Included Adapter" + }, + { + "group": "Connectivity", + "label": "Internal Memory", + "value": "128 MB (RAM)" + }, + { + "group": "Connectivity", + "label": "OS Compatibility", + "value": "Computer: macOS 11.13 or Later / Windows 10 or Later | Mobile: Android/iOS" + }, + { + "group": "General", + "label": "Display Size", + "value": "2.7\"" + }, + { + "group": "General", + "label": "Display Type", + "value": "Color Touchscreen LCD" + }, + { + "group": "General", + "label": "Power Source", + "value": "AC Adapter (Included)" + }, + { + "group": "General", + "label": "Battery", + "value": "No" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 120 VAC, 60 Hz" + }, + { + "group": "General", + "label": "Power Consumption", + "value": "10 W (Maximum) | 3 W (Ready) | 0.9 W (Sleep) | 0.2 W (Off)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "50 to 95°F / 10 to 35°C at 20 to 80% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "17.1 x 6.2 x 13.5\" / 43.4 x 15.7 x 34.3 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "17.4 lb / 7.9 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "19.28 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "19.8 x 18.9 x 11.6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1805117-REG/brother_sp1_sp_1_sublimation_printer.html", + "archive_url": "https://web.archive.org/web/20251008142411/https://www.bhphotovideo.com/c/product/1805117-REG/brother_sp1_sp_1_sublimation_printer.html", + "archive_timestamp": "20251008142411", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "canon-imageclass-mf3010-vp-multifunction-monochrome-laser-printer", + "name": "Canon imageCLASS MF3010 VP Multifunction Monochrome Laser Printer", + "brand": "Canon", + "bh_sku": "CAICMF3010VP", + "mpn": "5252B037", + "department_slug": "computers", + "subcategory_slug": "printers-scanners", + "product_type": "Printer", + "price_usd": 129.0, + "availability": "In Stock", + "condition": "New", + "description": "Designed for home and small office environments, the Canon imageCLASS MF3010 VP Multifunction Monochrome Laser Printer balances speedy performance and minimal maintenance in a compact design. It offers print, copy, and scan functions and is designed for smaller print jobs. The print speed is up to 19 ppm for letter size paper and up to 24 ppm for legal size paper. The maximum print resolution is 600 x 600 dpi, and the first printout time is approximately 8 seconds. Envelopes are supported as well. The copy speed and resolution are the same as the print speed and resolution, 19 ppm for letter size paper and 24 ppm for legal paper in up to 600 x 600 dpi. The scanner function allows black-and-white and color scanning and lets you convert scanned documents to searchable digital files, including high-compression PDF and searchable PDF (OCR). The scan resolution is also up to 600 x 600 dpi.", + "mount_type": null, + "sensor_size": "1x Contact Image Sensor (CIS)", + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Functions", + "value": "Print, Scan, Copy" + }, + { + "group": "Key Specs", + "label": "Printing Technology", + "value": "Laser" + }, + { + "group": "Key Specs", + "label": "Color Type", + "value": "Black" + }, + { + "group": "Key Specs", + "label": "Configuration", + "value": "1x Individual Cartridge" + }, + { + "group": "Key Specs", + "label": "Print Resolution", + "value": "600 x 600 dpi" + }, + { + "group": "Key Specs", + "label": "Media Sizes", + "value": "Input Tray 1 | Minimum: 3 x 5\" / 7.6 x 12.7 cm | Maximum: 8.5 x 14\" / 21.6 x 35.6 cm" + }, + { + "group": "Key Specs", + "label": "Scanner Type", + "value": "Flatbed Scanner" + }, + { + "group": "Key Specs", + "label": "Scanner Maximum Resolution", + "value": "600 x 600 dpi (Hardware)" + }, + { + "group": "Key Specs", + "label": "Power Source", + "value": "AC Adapter (Included)" + }, + { + "group": "Printer", + "label": "Printing Technology", + "value": "Laser" + }, + { + "group": "Printer", + "label": "Color Type", + "value": "Black" + }, + { + "group": "Printer", + "label": "Configuration", + "value": "1x Individual Cartridge" + }, + { + "group": "Printer", + "label": "Print Resolution", + "value": "600 x 600 dpi" + }, + { + "group": "Printer", + "label": "Duplex Printing", + "value": "No" + }, + { + "group": "Printer", + "label": "Printer Language", + "value": "UFR II LT" + }, + { + "group": "Printer", + "label": "Print Speed (By Time)", + "value": "Letter: 19 ppm | Legal: 24 ppm" + }, + { + "group": "Printer", + "label": "First Print Out Time", + "value": "8 Seconds" + }, + { + "group": "Printer", + "label": "Monthly Duty Cycle", + "value": "1000 Pages (Recommended)" + }, + { + "group": "Printer Media Handling", + "label": "Media Handling", + "value": "1 x Input Tray" + }, + { + "group": "Printer Media Handling", + "label": "Media Sizes", + "value": "Input Tray 1 | Minimum: 3 x 5\" / 7.6 x 12.7 cm | Maximum: 8.5 x 14\" / 21.6 x 35.6 cm" + }, + { + "group": "Printer Media Handling", + "label": "Media Weight", + "value": "Input Tray 1: 60 to 163 gsm / 16 to 43 lb" + }, + { + "group": "Printer Media Handling", + "label": "Paper Capacity", + "value": "Input Tray 1: 150 x Sheet | Output Tray: 100 x Sheet" + }, + { + "group": "Printer Media Handling", + "label": "Special Media Support", + "value": "Envelopes" + }, + { + "group": "Scanner", + "label": "Scanner Type", + "value": "Flatbed Scanner" + }, + { + "group": "Scanner", + "label": "Scanner Maximum Resolution", + "value": "600 x 600 dpi (Hardware)" + }, + { + "group": "Scanner", + "label": "Scan Modes", + "value": "Color, Monochrome" + }, + { + "group": "Scanner", + "label": "Image Sensor", + "value": "1x Contact Image Sensor (CIS)" + }, + { + "group": "Scanner", + "label": "Scan Speed", + "value": "2.6 Seconds per Page in Black & White | 7.9 Seconds per Page in Color" + }, + { + "group": "Scanner Media Handling", + "label": "Scan Sizes", + "value": "Flatbed | Maximum: 8.5 x 11\" / 21.6 x 27.9 cm" + }, + { + "group": "Copier", + "label": "Reduction/Enlargement", + "value": "50 to 200%" + }, + { + "group": "Copier", + "label": "Copy Speed", + "value": "19 cpm (Black) | 15.5 cpm (Black)" + }, + { + "group": "Copier", + "label": "Duplex Copying", + "value": "No" + }, + { + "group": "Copier", + "label": "Copy Resolution", + "value": "600 x 600 dpi (Black)" + }, + { + "group": "Connectivity", + "label": "Data I/O", + "value": "1x USB-B 2.0 Input" + }, + { + "group": "Connectivity", + "label": "Internal Memory", + "value": "64 GB" + }, + { + "group": "Connectivity", + "label": "OS Compatibility", + "value": "Windows 7 or Later / Linux / macOS 10.12 or Later" + }, + { + "group": "General", + "label": "Power Source", + "value": "AC Adapter (Included)" + }, + { + "group": "General", + "label": "Battery", + "value": "No" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 VAC, 50 / 60 Hz" + }, + { + "group": "General", + "label": "Power Consumption", + "value": "900 W (Maximum) | 460 W (Average) | 1.5 W (Sleep)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "50 to 86°F / 10 to 30°C at 20 to 80% Humidity" + }, + { + "group": "General", + "label": "Certifications", + "value": "EPEAT Silver" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "14.7 x 10.9 x 10\" / 37.3 x 27.7 x 25.4 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "16.8 lb / 7.6 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "26 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "19.9 x 19.3 x 14\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1702827-REG/canon_5252b037_imageclass_mf3010_vp_printer.html", + "archive_url": "https://web.archive.org/web/20250317235039/https://www.bhphotovideo.com/c/product/1702827-REG/canon_5252b037_imageclass_mf3010_vp_printer.html", + "archive_timestamp": "20250317235039", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "creality-halot-lite-resin-3d-printer", + "name": "Creality Halot-Lite Resin 3D Printer", + "brand": "Creality", + "bh_sku": "CRHALOTLITE", + "mpn": "HALOT-LITE", + "department_slug": "computers", + "subcategory_slug": "printers-scanners", + "product_type": "Printer", + "price_usd": 389.0, + "availability": "In Stock", + "condition": "New", + "description": "Unleash your creative side and print highly detailed models with the Creality Halot-Lite Resin 3D Printer. Using precision lighting and liquid resin, the Halot-Lite brings your imagination to life, enabling experienced and new users to create a wide range of miniatures, workable prototypes, and more.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Print Technology", + "value": "DLP (Digital Lighting Processing)" + }, + { + "group": "Key Specs", + "label": "Build Volume", + "value": "7.5 x 7.9 x 4.7\" / 19.0 x 20 x 12.0 cm" + }, + { + "group": "Printer", + "label": "Print Technology", + "value": "DLP (Digital Lighting Processing)" + }, + { + "group": "Printer", + "label": "Build Volume", + "value": "7.5 x 7.9 x 4.7\" / 19.0 x 20 x 12.0 cm" + }, + { + "group": "Printer", + "label": "Positioning Precision", + "value": "XY Axis: 50 micron / 0.05 mm" + }, + { + "group": "Printer", + "label": "Light Source", + "value": "405 nm" + }, + { + "group": "Build Area", + "label": "Build Area Type", + "value": "Enclosed" + }, + { + "group": "Build Area", + "label": "Extendable", + "value": "No" + }, + { + "group": "Build Area", + "label": "3D Scanner", + "value": "No" + }, + { + "group": "Build Area", + "label": "Monitoring Camera", + "value": "No" + }, + { + "group": "Connectivity", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "13 x 22.5 x 11.9\" / 330 x 572 x 301 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "23.4 lb / 10.6 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "31.045 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "26.9 x 17 x 15.4\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1705449-REG/creality_halot_lite_resin_3d_printer.html", + "archive_url": "https://web.archive.org/web/20250628161617/https://www.bhphotovideo.com/c/product/1705449-REG/creality_halot_lite_resin_3d_printer.html", + "archive_timestamp": "20250628161617", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "epson-ds-730n-color-duplex-document-scanner", + "name": "Epson DS-730N Color Duplex Document Scanner", + "brand": "Epson", + "bh_sku": "EPDS730N", + "mpn": "B11B259201", + "department_slug": "computers", + "subcategory_slug": "printers-scanners", + "product_type": "Printer", + "price_usd": 449.99, + "availability": "In Stock", + "condition": "New", + "description": "Get fast and efficient scanning performance with the DS-730N Color Duplex Document Scanner from Epson. A smart choice for business document management, the DS-730N utilizes a 100-sheet automatic document feeder to reach simplex scan speeds up to 40 ppm and duplex scan speeds up to 80 ipm, while also offering a peak daily duty cycle of 4500 sheets. The scanner easily handles documents ranging in size from 2 x 2\" up to 8.5 x 240\", and the unit provides an optical resolution of 600 dpi for sharp and color-accurate scans. Three dedicated Quick Send buttons with registered presets allow users to scan and send without using a computer, and a built-in network interface provides easy workgroup sharing so users can send scans to other computers on a network. Additionally, TWAIN and ISIS drivers ensure seamless integration with most document management systems. Enhanced features include paper protection and dirt detection, and with the DS-730N you can easily create searchable PDF files and save them to Dropbox, Evernote, Google Drive, and other cloud storage accounts.", + "mount_type": null, + "sensor_size": "1x Contact Image Sensor (CIS)", + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Scanner Type", + "value": "Automatic Document Feeder (ADF)" + }, + { + "group": "Key Specs", + "label": "Scanner Maximum Resolution", + "value": "600 dpi (Optical)" + }, + { + "group": "Key Specs", + "label": "Scanner Color Depth", + "value": "10-Bit (Internal) | 8-Bit (External)" + }, + { + "group": "Key Specs", + "label": "Power Source", + "value": "AC Adapter (Included)" + }, + { + "group": "Scanner", + "label": "Scanner Type", + "value": "Automatic Document Feeder (ADF)" + }, + { + "group": "Scanner", + "label": "Scanner Maximum Resolution", + "value": "600 dpi (Optical)" + }, + { + "group": "Scanner", + "label": "Scan Modes", + "value": "Color, Grayscale, Monochrome" + }, + { + "group": "Scanner", + "label": "Scanner Color Depth", + "value": "10-Bit (Internal) | 8-Bit (External)" + }, + { + "group": "Scanner", + "label": "Grayscale Depth", + "value": "10-Bit (Internal) | 8-Bit (External)" + }, + { + "group": "Scanner", + "label": "Light Source", + "value": "LED" + }, + { + "group": "Scanner", + "label": "Image Sensor", + "value": "1x Contact Image Sensor (CIS)" + }, + { + "group": "Scanner", + "label": "Duplex Scanning", + "value": "Yes" + }, + { + "group": "Scanner", + "label": "Single Pass Duplex", + "value": "Yes" + }, + { + "group": "Scanner", + "label": "Scan Speed", + "value": "40 ppm at 300 dpi in Color/Black & White | 80 ipm at 300 dpi in Color/Black & White" + }, + { + "group": "Scanner", + "label": "Automatic Image Corrections", + "value": "Yes" + }, + { + "group": "Scanner Media Handling", + "label": "Scan Sizes", + "value": "ADF | Minimum: 2 x 2\" / 5.1 x 5.1 cm | Maximum: 8.5 x 240\" / 21.6 x 609.6 cm" + }, + { + "group": "Scanner Media Handling", + "label": "Media Thickness", + "value": "ADF: Up to 47.2 mil / 1.2 mm" + }, + { + "group": "Scanner Media Handling", + "label": "Paper Capacity", + "value": "ADF: 100x Sheet" + }, + { + "group": "Scanner Media Handling", + "label": "Multi-Feed Detection", + "value": "Yes" + }, + { + "group": "Scanner Media Handling", + "label": "Media Weight", + "value": "ADF: 27 to 413 gsm / 50 to 105 lb" + }, + { + "group": "Scanner Media Handling", + "label": "Daily Duty Cycle", + "value": "4500 Scans" + }, + { + "group": "Scanner Media Handling", + "label": "Special Media Support", + "value": "Business Card, Check, Envelope, Index Card" + }, + { + "group": "Connectivity", + "label": "Data I/O", + "value": "1x USB-B 2.0 Input | 1x RJ45 Input" + }, + { + "group": "Connectivity", + "label": "Scanner Drivers", + "value": "TWAIN, ISIS" + }, + { + "group": "Connectivity", + "label": "OS Compatibility", + "value": "Windows / macOS" + }, + { + "group": "General", + "label": "Display Type", + "value": "Color LCD" + }, + { + "group": "General", + "label": "Power Source", + "value": "AC Adapter (Included)" + }, + { + "group": "General", + "label": "Battery", + "value": "No" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz at 1 A" + }, + { + "group": "General", + "label": "Power Consumption", + "value": "14 W (Maximum) | 5.9 W (Ready) | 1.5 W (Sleep) | 0.1 W (Off)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "41 to 95°F / 5 to 35°C at 15 to 80% Humidity" + }, + { + "group": "General", + "label": "Storage Conditions", + "value": "-13 to 140°F / -25 to 60°C" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "11.7 x 8.5 x 8.3\" / 29.7 x 21.6 x 21.1 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "Scanner | 7.9 lb / 3.6 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "10.78 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "14.6 x 12.6 x 10.6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1601977-REG/epson_b11b259201_ds_730n_document_scanner.html", + "archive_url": "https://web.archive.org/web/20250213103353/https://www.bhphotovideo.com/c/product/1601977-REG/epson_b11b259201_ds_730n_document_scanner.html", + "archive_timestamp": "20250213103353", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "epson-ds-770-ii-color-duplex-document-scanner", + "name": "Epson DS-770 II Color Duplex Document Scanner", + "brand": "Epson", + "bh_sku": "EPDS770II", + "mpn": "B11B262201", + "department_slug": "computers", + "subcategory_slug": "printers-scanners", + "product_type": "Printer", + "price_usd": 549.0, + "availability": "In Stock", + "condition": "New", + "description": "Get quick and reliable scanning performance with the DS-770 II Color Duplex Document Scanner from Epson. A smart choice for business document management, the DS-770 II utilizes a 100-sheet automatic document feeder to reach simplex scan speeds up to 45 ppm and duplex scan speeds up to 90 ipm, while also offering a peak daily duty cycle of 7000 sheets. The scanner easily handles documents ranging in size from 2 x 2\" up to 8.5 x 240\", and the unit provides an optical resolution of 600 dpi for sharp and color-accurate scans.", + "mount_type": null, + "sensor_size": "1x Contact Image Sensor (CIS)", + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/epds770ii.jpg", + "image_sha256": "9f820ab0b818d6a22cebb599e9d44c911228ecd658dde809efb87f6d7e7f522b", + "specs": [ + { + "group": "Key Specs", + "label": "Scanner Type", + "value": "Automatic Document Feeder (ADF)" + }, + { + "group": "Key Specs", + "label": "Scanner Maximum Resolution", + "value": "600 dpi (Optical)" + }, + { + "group": "Key Specs", + "label": "Scanner Color Depth", + "value": "30-Bit (Internal) | 24-Bit (External)" + }, + { + "group": "Key Specs", + "label": "Power Source", + "value": "AC Adapter (Included)" + }, + { + "group": "Scanner", + "label": "Scanner Type", + "value": "Automatic Document Feeder (ADF)" + }, + { + "group": "Scanner", + "label": "Scanner Maximum Resolution", + "value": "600 dpi (Optical)" + }, + { + "group": "Scanner", + "label": "Scan Modes", + "value": "Color, Grayscale, Monochrome" + }, + { + "group": "Scanner", + "label": "Scanner Color Depth", + "value": "30-Bit (Internal) | 24-Bit (External)" + }, + { + "group": "Scanner", + "label": "Grayscale Depth", + "value": "30-Bit (Internal) | 24-Bit (External)" + }, + { + "group": "Scanner", + "label": "Light Source", + "value": "LED" + }, + { + "group": "Scanner", + "label": "Image Sensor", + "value": "1x Contact Image Sensor (CIS)" + }, + { + "group": "Scanner", + "label": "Duplex Scanning", + "value": "Yes" + }, + { + "group": "Scanner", + "label": "Single Pass Duplex", + "value": "Yes" + }, + { + "group": "Scanner", + "label": "Scan Speed", + "value": "45 ppm at 300 dpi in Color/Grayscale/Black & White | 90 ipm at 300 dpi in Color/Grayscale/Black & White" + }, + { + "group": "Scanner", + "label": "Automatic Image Corrections", + "value": "Yes" + }, + { + "group": "Scanner Media Handling", + "label": "Scan Sizes", + "value": "ADF | Minimum: 2 x 2\" / 5.1 x 5.1 cm | Maximum: 8.5 x 240\" / 21.6 x 609.6 cm" + }, + { + "group": "Scanner Media Handling", + "label": "Media Thickness", + "value": "ADF: Up to 47.2 mil / 1.2 mm" + }, + { + "group": "Scanner Media Handling", + "label": "Paper Capacity", + "value": "ADF: 100x Sheet" + }, + { + "group": "Scanner Media Handling", + "label": "Multi-Feed Detection", + "value": "Yes" + }, + { + "group": "Scanner Media Handling", + "label": "Media Weight", + "value": "27 to 413 gsm / 50 to 105 lb" + }, + { + "group": "Scanner Media Handling", + "label": "Daily Duty Cycle", + "value": "7000 Scans" + }, + { + "group": "Scanner Media Handling", + "label": "Special Media Support", + "value": "Business Card, Check, Credit Card, Envelope, ID Card, Index Card" + }, + { + "group": "Connectivity", + "label": "Data I/O", + "value": "1x USB-B 3.0 / 3.1/3.2 Gen 1 Input" + }, + { + "group": "Connectivity", + "label": "Scanner Drivers", + "value": "TWAIN, ISIS" + }, + { + "group": "Connectivity", + "label": "OS Compatibility", + "value": "Windows / macOS" + }, + { + "group": "General", + "label": "Power Source", + "value": "AC Adapter (Included)" + }, + { + "group": "General", + "label": "Battery", + "value": "No" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz at 1 A" + }, + { + "group": "General", + "label": "Power Consumption", + "value": "12 W (Maximum) | 5.4 W (Ready) | 1 W (Sleep) | 0.1 W (Off)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "41 to 95°F / 5 to 35°C at 10 to 80% Humidity" + }, + { + "group": "General", + "label": "Storage Conditions", + "value": "-13 to 140°F / -25 to 60°C" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "11.7 x 12.5 x 7.7\" / 29.7 x 31.8 x 19.6 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "8.1 lb / 3.7 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "10 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "16 x 11.3 x 9.7\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1601979-REG/epson_b11b262201_ds_770_ii_document_scanner.html", + "archive_url": "https://web.archive.org/web/20250825134145/https://www.bhphotovideo.com/c/product/1601979-REG/epson_b11b262201_ds_770_ii_document_scanner.html", + "archive_timestamp": "20250825134145", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "epson-es-500w-ii-wireless-duplex-document-scanner", + "name": "Epson ES-500W II Wireless Duplex Document Scanner", + "brand": "Epson", + "bh_sku": "EPES500WII", + "mpn": "B11B263201", + "department_slug": "computers", + "subcategory_slug": "printers-scanners", + "product_type": "Printer", + "price_usd": 319.99, + "availability": "In Stock", + "condition": "New", + "description": "Organize your documents and quickly scan them with the ES-500W II Wireless Duplex Document Scanner from Epson. Featuring simplex scan speeds of 35 ppm and duplex scan speeds of 70 ipm, this reliable and easy-to-use scanner offers you a 50-sheet Auto Document Feeder, which allows you to breeze through stacks of documents of varying sizes. Intuitive Epson ScanSmart Software means you can easily preview, email, and upload your scans, and the included TWAIN driver ensures compatibility with most document management software.", + "mount_type": null, + "sensor_size": "2x Contact Image Sensor (CIS)", + "focal_length": null, + "connectivity": "Wi-Fi", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Scanner Type", + "value": "Automatic Document Feeder (ADF)" + }, + { + "group": "Key Specs", + "label": "Scanner Maximum Resolution", + "value": "600 dpi (Optical) | 1200 dpi (Interpolated)" + }, + { + "group": "Key Specs", + "label": "Scanner Color Depth", + "value": "24-Bit (External) | 30-Bit (Internal)" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Wi-Fi" + }, + { + "group": "Key Specs", + "label": "Power Source", + "value": "AC Adapter (Included)" + }, + { + "group": "Scanner", + "label": "Scanner Type", + "value": "Automatic Document Feeder (ADF)" + }, + { + "group": "Scanner", + "label": "Scanner Maximum Resolution", + "value": "600 dpi (Optical) | 1200 dpi (Interpolated)" + }, + { + "group": "Scanner", + "label": "Scan Modes", + "value": "Color, Grayscale, Monochrome" + }, + { + "group": "Scanner", + "label": "Scanner Color Depth", + "value": "24-Bit (External) | 30-Bit (Internal)" + }, + { + "group": "Scanner", + "label": "Light Source", + "value": "LED" + }, + { + "group": "Scanner", + "label": "Image Sensor", + "value": "2x Contact Image Sensor (CIS)" + }, + { + "group": "Scanner", + "label": "Duplex Scanning", + "value": "Yes" + }, + { + "group": "Scanner", + "label": "Single Pass Duplex", + "value": "Yes" + }, + { + "group": "Scanner", + "label": "Scan Speed", + "value": "Simplex Speed | 35 ppm in Color/Grayscale/Black & White | Duplex Speed | 70 ipm in Color/Grayscale/Black & White" + }, + { + "group": "Scanner", + "label": "Automatic Image Corrections", + "value": "Yes" + }, + { + "group": "Scanner", + "label": "File Formats", + "value": "PDF" + }, + { + "group": "Scanner Media Handling", + "label": "Scan Sizes", + "value": "Minimum: 2 x 2\" / 5.1 x 5.1 cm | Maximum: 8.5 x 240\" / 21.6 x 609.6 cm" + }, + { + "group": "Scanner Media Handling", + "label": "Paper Capacity", + "value": "ADF: 50x Sheet" + }, + { + "group": "Scanner Media Handling", + "label": "Multi-Feed Detection", + "value": "Yes" + }, + { + "group": "Scanner Media Handling", + "label": "Media Weight", + "value": "27 to 413 gsm / 14 to 105 lb" + }, + { + "group": "Scanner Media Handling", + "label": "Daily Duty Cycle", + "value": "4000 Scans" + }, + { + "group": "Scanner Media Handling", + "label": "Special Media Support", + "value": "Business Card, Envelope, ID Card, Index Card" + }, + { + "group": "Connectivity", + "label": "Data I/O", + "value": "1x USB-A 3.0 / 3.1/3.2 Gen 1 Output" + }, + { + "group": "Connectivity", + "label": "Wireless", + "value": "Wi-Fi" + }, + { + "group": "Connectivity", + "label": "Scanner Drivers", + "value": "TWAIN" + }, + { + "group": "Connectivity", + "label": "OS Compatibility", + "value": "Windows / macOS" + }, + { + "group": "General", + "label": "Power Source", + "value": "AC Adapter (Included)" + }, + { + "group": "General", + "label": "Battery", + "value": "No" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "General", + "label": "Power Consumption", + "value": "18 W (Maximum) | 5.5 W (Ready) | 1.3 W (Sleep) | 0.1 W (Off)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "41 to 95°F / 5 to 35°C" + }, + { + "group": "General", + "label": "Storage Conditions", + "value": "-13 to 140°F / -25 to 60°C" + }, + { + "group": "General", + "label": "Certifications", + "value": "RoHS" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "11.6 x 6.9 x 6.6\" / 29.5 x 17.5 x 16.8 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "8.1 lb / 3.7 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "10.5 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "14.2 x 11.2 x 10\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1604010-REG/epson_b11b263201_es_500w_ii_document_scanner.html", + "archive_url": "https://web.archive.org/web/20250427042835/https://www.bhphotovideo.com/c/product/1604010-REG/epson_b11b263201_es_500w_ii_document_scanner.html", + "archive_timestamp": "20250427042835", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "epson-workforce-wf-2960-wireless-all-in-one-color-inkjet-printer", + "name": "Epson WorkForce WF-2960 Wireless All-in-One Color Inkjet Printer", + "brand": "Epson", + "bh_sku": "EPWF2960", + "mpn": "C11CK60201", + "department_slug": "computers", + "subcategory_slug": "printers-scanners", + "product_type": "Printer", + "price_usd": 119.99, + "availability": "In Stock", + "condition": "New", + "description": "Built with Epson's PrecisionCore Heat-Free printing technology, the Epson WorkForce WF-2960 is a professional-quality home office printer designed to deliver sharp text and vibrant colors at fast speeds.", + "mount_type": null, + "sensor_size": "1x Contact Image Sensor (CIS)", + "focal_length": null, + "connectivity": "802.11b/g Wi-Fi", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Functions", + "value": "Print, Scan, Copy, Fax" + }, + { + "group": "Key Specs", + "label": "Printing Technology", + "value": "Inkjet" + }, + { + "group": "Key Specs", + "label": "Color Type", + "value": "Color" + }, + { + "group": "Key Specs", + "label": "Configuration", + "value": "4x Individual Cartridge" + }, + { + "group": "Key Specs", + "label": "Ink Color", + "value": "1x Cyan | 1x Magenta | 1x Yellow | 1x Black" + }, + { + "group": "Key Specs", + "label": "Print Resolution", + "value": "4800 x 1200 dpi" + }, + { + "group": "Key Specs", + "label": "Media Sizes", + "value": "Input Tray 1 | Minimum: 3.5 x 5\" / 8.89 x 12.7 cm | Maximum: 8.5 x 47.2\" / 21.59 x 119.89 cm" + }, + { + "group": "Key Specs", + "label": "Scanner Type", + "value": "Flatbed Scanner with Automatic Document Feeder (ADF)" + }, + { + "group": "Key Specs", + "label": "Scanner Maximum Resolution", + "value": "ADF | 1200 x 2400 dpi (Interpolated)" + }, + { + "group": "Key Specs", + "label": "Scanner Color Depth", + "value": "48-Bit (Internal) | 24-Bit (External)" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "802.11b/g Wi-Fi" + }, + { + "group": "Key Specs", + "label": "Power Source", + "value": "AC Adapter (Included)" + }, + { + "group": "Printer", + "label": "Printing Technology", + "value": "Inkjet" + }, + { + "group": "Printer", + "label": "Color Type", + "value": "Color" + }, + { + "group": "Printer", + "label": "Configuration", + "value": "4x Individual Cartridge" + }, + { + "group": "Printer", + "label": "Ink Color", + "value": "1x Cyan | 1x Magenta | 1x Yellow | 1x Black" + }, + { + "group": "Printer", + "label": "Compatible Cartridges", + "value": "Epson 222" + }, + { + "group": "Printer", + "label": "Print Resolution", + "value": "4800 x 1200 dpi" + }, + { + "group": "Printer", + "label": "Borderless Printing", + "value": "Yes: Up to 8.5 x 11\" / 21.59 x 27.94 cm" + }, + { + "group": "Printer", + "label": "Duplex Printing", + "value": "Yes" + }, + { + "group": "Printer", + "label": "Printer Language", + "value": "ESC/P-R" + }, + { + "group": "Printer", + "label": "Print Speed (By Time)", + "value": "14 ppm (Black) | 7.5 ppm (Color)" + }, + { + "group": "Printer", + "label": "Monthly Duty Cycle", + "value": "5000 Pages" + }, + { + "group": "Printer Media Handling", + "label": "Media Handling", + "value": "1 x Input Tray" + }, + { + "group": "Printer Media Handling", + "label": "Media Sizes", + "value": "Input Tray 1 | Minimum: 3.5 x 5\" / 8.89 x 12.7 cm | Maximum: 8.5 x 47.2\" / 21.59 x 119.89 cm" + }, + { + "group": "Printer Media Handling", + "label": "Paper Capacity", + "value": "Input Tray 1: 150 x Sheet" + }, + { + "group": "Printer Media Handling", + "label": "Special Media Support", + "value": "Envelopes" + }, + { + "group": "Scanner", + "label": "Scanner Type", + "value": "Flatbed Scanner with Automatic Document Feeder (ADF)" + }, + { + "group": "Scanner", + "label": "Scanner Maximum Resolution", + "value": "ADF | 1200 x 2400 dpi (Interpolated)" + }, + { + "group": "Scanner", + "label": "Scan Modes", + "value": "Color, Grayscale, Monochrome" + }, + { + "group": "Scanner", + "label": "Scanner Color Depth", + "value": "48-Bit (Internal) | 24-Bit (External)" + }, + { + "group": "Scanner", + "label": "Grayscale Depth", + "value": "16-Bit (Internal) | 8-Bit (External)" + }, + { + "group": "Scanner", + "label": "Image Sensor", + "value": "1x Contact Image Sensor (CIS)" + }, + { + "group": "Scanner", + "label": "Duplex Scanning", + "value": "No" + }, + { + "group": "Scanner Media Handling", + "label": "Scan Sizes", + "value": "ADF | Maximum: 8.5 x 14\" / 21.59 x 35.56 cm | Flatbed | Maximum: 8.5 x 11.7\" / 21.59 x 29.72 cm" + }, + { + "group": "Scanner Media Handling", + "label": "Paper Capacity", + "value": "ADF: 30x Sheet" + }, + { + "group": "Copier", + "label": "Number of Copies", + "value": "Up to 99 Copies" + }, + { + "group": "Copier", + "label": "Reduction/Enlargement", + "value": "25 to 400%" + }, + { + "group": "Copier", + "label": "Copy Speed", + "value": "11 cpm (Black) | 5.5 cpm (Color)" + }, + { + "group": "Copier", + "label": "Duplex Copying", + "value": "Yes" + }, + { + "group": "Copier", + "label": "Copy Resolution", + "value": "720 x 720 dpi | 360 x 360 dpi" + }, + { + "group": "Fax", + "label": "Modem Transmission Speed", + "value": "33.6 kb/s" + }, + { + "group": "Fax", + "label": "Duplex Support", + "value": "No" + }, + { + "group": "Fax", + "label": "Speed Dial Capacity", + "value": "60 Numbers" + }, + { + "group": "Connectivity", + "label": "Data I/O", + "value": "1x USB-B Input | 1x RJ45 Input | 1x RJ11 Input | 1x RJ11 Output" + }, + { + "group": "Connectivity", + "label": "Wireless", + "value": "802.11b/g Wi-Fi" + }, + { + "group": "Connectivity", + "label": "Direct Printing", + "value": "Android, Apple AirPrint, Epson Email Print, Epson Remote Print, Mopria, Wi-Fi Direct" + }, + { + "group": "Connectivity", + "label": "Scanner Drivers", + "value": "TWAIN" + }, + { + "group": "Connectivity", + "label": "OS Compatibility", + "value": "Windows / macOS / Chrome OS" + }, + { + "group": "General", + "label": "Display Size", + "value": "2.4\"" + }, + { + "group": "General", + "label": "Display Type", + "value": "Color Touchscreen" + }, + { + "group": "General", + "label": "Power Source", + "value": "AC Adapter (Included)" + }, + { + "group": "General", + "label": "Battery", + "value": "No" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "General", + "label": "Power Consumption", + "value": "Printer | 12 W (Maximum) | 5.4 W (Ready) | 1 W (Sleep) | 0.2 W (Off)" + }, + { + "group": "General", + "label": "Max Acoustic Noise", + "value": "6.4 dBA (Power) | 50 dBA (Pressure)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "50 to 95°F / 10 to 35°C at 20 to 80% Humidity (Recommended)" + }, + { + "group": "General", + "label": "Storage Conditions", + "value": "-4 to 104°F / -20 to 40°C at 5 to 85% Humidity" + }, + { + "group": "General", + "label": "Certifications", + "value": "ENERGY STAR, RoHS" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "19.8 x 16.4 x 10\" / 50.3 x 41.7 x 25.4 cm | 16.4 x 13.7 x 9.1\" / 41.7 x 34.8 x 23.1 cm (Storage)" + }, + { + "group": "General", + "label": "Weight", + "value": "14.1 lb / 6.4 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "17.655 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "17.6 x 16.6 x 12.1\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1707885-REG/epson_c11ck60201_workforce_wf_2960_all_in_one_printer.html", + "archive_url": "https://web.archive.org/web/20250815073421/https://www.bhphotovideo.com/c/product/1707885-REG/epson_c11ck60201_workforce_wf_2960_all_in_one_printer.html", + "archive_timestamp": "20250815073421", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "hp-laserjet-enterprise-m507dn-monochrome-printer", + "name": "HP LaserJet Enterprise M507dn Monochrome Printer", + "brand": "HP", + "bh_sku": "HEM507DN", + "mpn": "1PV87A#BGJ", + "department_slug": "computers", + "subcategory_slug": "printers-scanners", + "product_type": "Printer", + "price_usd": 1009.0, + "availability": "In Stock", + "condition": "New", + "description": "Work securely and efficiently and get high-quality results with the LaserJet Enterprise M507dn Monochrome Printer from HP. Featuring two input trays, which hold a total of 650 sheets of paper, and a 250-sheet output tray to hold printed documents, the printer's 1200 x 1200 dpi print resolution ensures sharp text on business documents, letterhead, envelopes, and labels. First print-out speeds are as fast as 5.9 seconds, and once running, the M507dn has an impressive print speed up to 45 ppm. A 2.7\" LCD with keypad lets you quickly manage printer settings and jobs, and the unit comes with USB 2.0 and Ethernet connectivity. Standard toner cartridge yield is approximately 5000 pages, with options for high-yield and extra-high-yield cartridges rated for 10,000 and 20,000 pages, respectively.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Functions", + "value": "Print" + }, + { + "group": "Key Specs", + "label": "Printing Technology", + "value": "Laser" + }, + { + "group": "Key Specs", + "label": "Color Type", + "value": "Black" + }, + { + "group": "Key Specs", + "label": "Configuration", + "value": "1x Toner" + }, + { + "group": "Key Specs", + "label": "Print Resolution", + "value": "1200 x 1200 dpi" + }, + { + "group": "Key Specs", + "label": "Media Sizes", + "value": "Input Tray 1 | Minimum: 3 x 5\" / 7.62 x 12.7 cm | Maximum: 8.5 x 14\" / 21.59 x 35.56 cm | Input Tray 2 | Minimum: 4.1 x 5.8\" / 10.41 x 14.73 cm | Maximum: 8.5 x 14\" / 21.59 x 35.56 cm" + }, + { + "group": "Printer", + "label": "Printing Technology", + "value": "Laser" + }, + { + "group": "Printer", + "label": "Color Type", + "value": "Black" + }, + { + "group": "Printer", + "label": "Configuration", + "value": "1x Toner" + }, + { + "group": "Printer", + "label": "Print Resolution", + "value": "1200 x 1200 dpi" + }, + { + "group": "Printer", + "label": "Duplex Printing", + "value": "Yes" + }, + { + "group": "Printer", + "label": "Printer Language", + "value": "HP PCL 5, HP PCL 6, HP Postscript Level 3 (Emulation), Native PDF" + }, + { + "group": "Printer", + "label": "Print Speed (By Time)", + "value": "45 ppm" + }, + { + "group": "Printer", + "label": "First Print Out Time", + "value": "5.9 Seconds (Black)" + }, + { + "group": "Printer", + "label": "Monthly Duty Cycle", + "value": "7500 Pages (Recommended) | 150,000 Pages" + }, + { + "group": "Printer Media Handling", + "label": "Media Handling", + "value": "2 x Input Tray, Output Tray" + }, + { + "group": "Printer Media Handling", + "label": "Media Sizes", + "value": "Input Tray 1 | Minimum: 3 x 5\" / 7.62 x 12.7 cm | Maximum: 8.5 x 14\" / 21.59 x 35.56 cm | Input Tray 2 | Minimum: 4.1 x 5.8\" / 10.41 x 14.73 cm | Maximum: 8.5 x 14\" / 21.59 x 35.56 cm" + }, + { + "group": "Printer Media Handling", + "label": "Media Weight", + "value": "Input Tray 1: 60 to 199 gsm / 16 to 54 lb | Input Tray 2: 60 to 120 gsm / 16 to 32 lb" + }, + { + "group": "Printer Media Handling", + "label": "Paper Capacity", + "value": "Input Tray 1: 100 x Sheet | Input Tray 2: 550 x Sheet | Output Tray: 250 x Sheet" + }, + { + "group": "Printer Media Handling", + "label": "Special Media Support", + "value": "Envelopes" + }, + { + "group": "Connectivity", + "label": "Data I/O", + "value": "1x USB-B 2.0 Input | 1x USB-A 2.0 Input (Flash Drive Only) | 1x USB-A 2.0 Input (Peripheral Device Only) | 1x RJ45 Input" + }, + { + "group": "Connectivity", + "label": "Processor Speed", + "value": "1.2 GHz" + }, + { + "group": "Connectivity", + "label": "Internal Memory", + "value": "512 MB" + }, + { + "group": "Connectivity", + "label": "OS Compatibility", + "value": "Windows / macOS" + }, + { + "group": "General", + "label": "Display Size", + "value": "2.7\"" + }, + { + "group": "General", + "label": "Input Power", + "value": "100 VAC, 60 Hz" + }, + { + "group": "General", + "label": "Power Consumption", + "value": "601 W (Maximum) | 7.6 W (Ready) | 2.6 W (Sleep) | 0.06 W (Off)" + }, + { + "group": "General", + "label": "Max Acoustic Noise", + "value": "55 dBA (Pressure) | 3.9 BA (Power)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "50 to 91°F / 10 to 32°C at 30 to 70% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "16.5 x 11.8 x 14.8\" / 41.8 x 29.9 x 37.6 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "25.35 lb / 11.5 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "29.475 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "19.3 x 18 x 15.7\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1503645-REG/hp_1pv87a_bgj_laserjet_enterprise_m507dn_printer.html", + "archive_url": "https://web.archive.org/web/20251013115134/https://www.bhphotovideo.com/c/product/1503645-REG/hp_1pv87a_bgj_laserjet_enterprise_m507dn_printer.html", + "archive_timestamp": "20251013115134", + "fetched_at": "2026-09-12T17:27:26Z" + } + }, + { + "slug": "dji-osmo-pocket-3-drone-like-imaging-kit-14", + "name": "DJI Osmo Pocket 3 Drone-Like Imaging Kit (14')", + "brand": "DJI", + "bh_sku": "DJOP3DLIM15K", + "mpn": null, + "department_slug": "drones", + "subcategory_slug": "drones", + "product_type": "Drone", + "price_usd": 1359.29, + "availability": "In Stock", + "condition": "New", + "description": "Capture high-flying footage without requiring a drone using the DJI Osmo Pocket 3 Drone-Like Imaging Kit put together by B&H. The kit consists of the Osmo Pocket 3, a 14' boompole, a memory card, a universal stretchy mount to secure accessories to the bottom of your boompole, and a screw adapter.", + "mount_type": null, + "sensor_size": "1\"-Type CMOS", + "focal_length": "20mm (35mm Equivalent)", + "connectivity": "Wi-Fi / Bluetooth LE", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Imaging", + "label": "Image Sensor", + "value": "1\"-Type CMOS" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Integrated 3-Axis Gimbal" + }, + { + "group": "Optics per Lens", + "label": "Focal Length", + "value": "20mm (35mm Equivalent)" + }, + { + "group": "Optics per Lens", + "label": "Maximum Aperture", + "value": "f/2" + }, + { + "group": "Optics per Lens", + "label": "Minimum Focus Distance", + "value": "7.9\" / 20.1 cm" + }, + { + "group": "Optics per Lens", + "label": "Field of View", + "value": "180°" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "MP4 via H.264/AVC | 3840 x 2160 at 24/25/30/48/50/60 fps | 2688 x 1512 at 24/25/30/48/50/60 fps | 1920 x 1080 at 24/25/30/48/50/60 fps | 1920 x 1080p at 24/25/30/48/50/60 fps | 3072 x 3072 at 24/25/30/48/50/60 fps |" + }, + { + "group": "Video Capture", + "label": "Still Image Support", + "value": "JPEG / Raw | 9.4 MP" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "AAC: at 48 kHz" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "UVC/UAC | 1920 x 1080" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "1/8000 to 1 Second" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Native: 50 to 6400 (50 to 16,000 Extended)" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Presets: Auto" + }, + { + "group": "Connectivity", + "label": "Wireless", + "value": "Wi-Fi / Bluetooth LE" + }, + { + "group": "Connectivity", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: DJI Mimo" + }, + { + "group": "Connectivity", + "label": "Media/Memory Card Slot", + "value": "Single Slot: microSD/microSDHC/microSDXC (UHS-II) [512 GB Maximum]" + }, + { + "group": "Connectivity", + "label": "Inputs/Outputs", + "value": "1x USB-C Power Input" + }, + { + "group": "Power", + "label": "Battery Type", + "value": "Rechargeable Lithium-Ion Polymer Battery Pack (7.70 VDC, 1300 mAh)" + }, + { + "group": "Power", + "label": "Charging Time", + "value": "0.5 Hours" + }, + { + "group": "Power", + "label": "Estimated Battery Life", + "value": "2.6 Hours" + }, + { + "group": "Environmental", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C" + }, + { + "group": "General", + "label": "Display Type", + "value": "Fixed LCD" + }, + { + "group": "General", + "label": "Built-In Light", + "value": "No" + }, + { + "group": "General", + "label": "Built-In Speaker", + "value": "No" + }, + { + "group": "General", + "label": "Dimensions (W x D x H)", + "value": "5.5 x 1.7 x 1.3\" / 139.7 x 42.2 x 33.5 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "6.3 oz / 179 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.76 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.2 x 3.9 x 1.8\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1927555-REG/dji_osmo_pocket_3_drone_like.html", + "archive_url": "https://web.archive.org/web/20251210032151/https://www.bhphotovideo.com/c/product/1927555-REG/dji_osmo_pocket_3_drone_like.html", + "archive_timestamp": "20251210032151", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "dji-osmo-pocket-3-drone-like-imaging-kit-20", + "name": "DJI Osmo Pocket 3 Drone-Like Imaging Kit (20')", + "brand": "DJI", + "bh_sku": "DJOP3DLIM20K", + "mpn": null, + "department_slug": "drones", + "subcategory_slug": "drones", + "product_type": "Drone", + "price_usd": 1507.29, + "availability": "In Stock", + "condition": "New", + "description": "Capture high-flying footage without requiring a drone using the DJI Osmo Pocket 3 Drone-Like Imaging Kit put together by B&H. The kit consists of the Osmo Pocket 3, a 20' boompole, a memory card, a universal stretchy mount to secure accessories to the bottom of your boompole, and a screw adapter.", + "mount_type": null, + "sensor_size": "1\"-Type CMOS", + "focal_length": "20mm (35mm Equivalent)", + "connectivity": "Wi-Fi / Bluetooth LE", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Imaging", + "label": "Image Sensor", + "value": "1\"-Type CMOS" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Integrated 3-Axis Gimbal" + }, + { + "group": "Optics per Lens", + "label": "Focal Length", + "value": "20mm (35mm Equivalent)" + }, + { + "group": "Optics per Lens", + "label": "Maximum Aperture", + "value": "f/2" + }, + { + "group": "Optics per Lens", + "label": "Minimum Focus Distance", + "value": "7.9\" / 20.1 cm" + }, + { + "group": "Optics per Lens", + "label": "Field of View", + "value": "180°" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "MP4 via H.264/AVC | 3840 x 2160 at 24/25/30/48/50/60 fps | 2688 x 1512 at 24/25/30/48/50/60 fps | 1920 x 1080 at 24/25/30/48/50/60 fps | 1920 x 1080p at 24/25/30/48/50/60 fps | 3072 x 3072 at 24/25/30/48/50/60 fps |" + }, + { + "group": "Video Capture", + "label": "Still Image Support", + "value": "JPEG / Raw | 9.4 MP" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "AAC: at 48 kHz" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "UVC/UAC | 1920 x 1080" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "1/8000 to 1 Second" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Native: 50 to 6400 (50 to 16,000 Extended)" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Presets: Auto" + }, + { + "group": "Connectivity", + "label": "Wireless", + "value": "Wi-Fi / Bluetooth LE" + }, + { + "group": "Connectivity", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: DJI Mimo" + }, + { + "group": "Connectivity", + "label": "Media/Memory Card Slot", + "value": "Single Slot: microSD/microSDHC/microSDXC (UHS-II) [512 GB Maximum]" + }, + { + "group": "Connectivity", + "label": "Inputs/Outputs", + "value": "1x USB-C Power Input" + }, + { + "group": "Power", + "label": "Battery Type", + "value": "Rechargeable Lithium-Ion Polymer Battery Pack (7.70 VDC, 1300 mAh)" + }, + { + "group": "Power", + "label": "Charging Time", + "value": "0.5 Hours" + }, + { + "group": "Power", + "label": "Estimated Battery Life", + "value": "2.6 Hours" + }, + { + "group": "Environmental", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C" + }, + { + "group": "General", + "label": "Display Type", + "value": "Fixed LCD" + }, + { + "group": "General", + "label": "Built-In Light", + "value": "No" + }, + { + "group": "General", + "label": "Built-In Speaker", + "value": "No" + }, + { + "group": "General", + "label": "Dimensions (W x D x H)", + "value": "5.5 x 1.7 x 1.3\" / 139.7 x 42.2 x 33.5 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "6.3 oz / 179 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.76 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.2 x 3.9 x 1.8\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1927556-REG/dji_osmo_pocket_3_drone_like.html", + "archive_url": "https://web.archive.org/web/20251206230717/https://www.bhphotovideo.com/c/product/1927556-REG/dji_osmo_pocket_3_drone_like.html", + "archive_timestamp": "20251206230717", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "dji-osmo-pocket-3-drone-like-imaging-kit-9", + "name": "DJI Osmo Pocket 3 Drone-Like Imaging Kit (9')", + "brand": "DJI", + "bh_sku": "DJOP3DLIM9K", + "mpn": null, + "department_slug": "drones", + "subcategory_slug": "drones", + "product_type": "Drone", + "price_usd": 769.39, + "availability": "In Stock", + "condition": "New", + "description": "Capture high-flying footage without requiring a drone using the DJI Osmo Pocket 3 Drone-Like Imaging Kit put together by B&H. The kit consists of the Osmo Pocket 3, a 9' boompole, a memory card, a universal stretchy mount to secure accessories to the bottom of your boompole, and a screw adapter.", + "mount_type": null, + "sensor_size": "1\"-Type CMOS", + "focal_length": "20mm (35mm Equivalent)", + "connectivity": "Wi-Fi / Bluetooth LE", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Imaging", + "label": "Image Sensor", + "value": "1\"-Type CMOS" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Integrated 3-Axis Gimbal" + }, + { + "group": "Optics per Lens", + "label": "Focal Length", + "value": "20mm (35mm Equivalent)" + }, + { + "group": "Optics per Lens", + "label": "Maximum Aperture", + "value": "f/2" + }, + { + "group": "Optics per Lens", + "label": "Minimum Focus Distance", + "value": "7.9\" / 20.1 cm" + }, + { + "group": "Optics per Lens", + "label": "Field of View", + "value": "180°" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "MP4 via H.264/AVC | 3840 x 2160 at 24/25/30/48/50/60 fps | 2688 x 1512 at 24/25/30/48/50/60 fps | 1920 x 1080 at 24/25/30/48/50/60 fps | 1920 x 1080p at 24/25/30/48/50/60 fps | 3072 x 3072 at 24/25/30/48/50/60 fps |" + }, + { + "group": "Video Capture", + "label": "Still Image Support", + "value": "JPEG / Raw | 9.4 MP" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "AAC: at 48 kHz" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "UVC/UAC | 1920 x 1080" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "1/8000 to 1 Second" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Native: 50 to 6400 (50 to 16,000 Extended)" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Presets: Auto" + }, + { + "group": "Connectivity", + "label": "Wireless", + "value": "Wi-Fi / Bluetooth LE" + }, + { + "group": "Connectivity", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: DJI Mimo" + }, + { + "group": "Connectivity", + "label": "Media/Memory Card Slot", + "value": "Single Slot: microSD/microSDHC/microSDXC (UHS-II) [512 GB Maximum]" + }, + { + "group": "Connectivity", + "label": "Inputs/Outputs", + "value": "1x USB-C Power Input" + }, + { + "group": "Power", + "label": "Battery Type", + "value": "Rechargeable Lithium-Ion Polymer Battery Pack (7.70 VDC, 1300 mAh)" + }, + { + "group": "Power", + "label": "Charging Time", + "value": "0.5 Hours" + }, + { + "group": "Power", + "label": "Estimated Battery Life", + "value": "2.6 Hours" + }, + { + "group": "Environmental", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C" + }, + { + "group": "General", + "label": "Display Type", + "value": "Fixed LCD" + }, + { + "group": "General", + "label": "Built-In Light", + "value": "No" + }, + { + "group": "General", + "label": "Built-In Speaker", + "value": "No" + }, + { + "group": "General", + "label": "Dimensions (W x D x H)", + "value": "5.5 x 1.7 x 1.3\" / 139.7 x 42.2 x 33.5 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "6.3 oz / 179 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.76 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.2 x 3.9 x 1.8\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1927554-REG/dji_osmo_pocket_3_drone_like.html", + "archive_url": "https://web.archive.org/web/20251202204129/https://www.bhphotovideo.com/c/product/1927554-REG/dji_osmo_pocket_3_drone_like.html", + "archive_timestamp": "20251202204129", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "aputure-mc-rgbww-led-light", + "name": "Aputure MC RGBWW LED Light", + "brand": "Aputure", + "bh_sku": "APMCRGBWWFL", + "mpn": "APA0142A10", + "department_slug": "lighting", + "subcategory_slug": "lighting-kits", + "product_type": "Light", + "price_usd": 90.0, + "availability": "In Stock", + "condition": "New", + "description": "The Aputure MC RGBWW LED Light is a palm-size multifunction light measuring only 3.7 x 2.4 x 0.7\". It can be mounted via a 1/4\"-20 thread or attached to various metal objects via its built-in magnets. Part of the Aputure M-series of lights, it features RGB LEDs as well as tungsten- and daylight-balanced LEDs. It offers 360° hue control and emits up to 95% of the BT 2020 color gamut. The compact light also packs nine built-in special effects settings. You can control it with its native buttons, control wheels, and a small OLED display in the top corner, or remotely using the companion iOS/Android Aputure Sidus Link app.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Item Type", + "value": "1x LED Light Panel" + }, + { + "group": "Key Specs", + "label": "Included Storage Case", + "value": "Yes" + }, + { + "group": "Key Specs", + "label": "Photometrics", + "value": "Unspecified Color Temperature: | 9 fc / 100 Lux at 3.3' / 1 m  | 102 fc / 1100 Lux at 0.98' / 0.3 m | 37 fc / 400 Lux at 1.64' / 0.5 m" + }, + { + "group": "Key Specs", + "label": "Color Temperature", + "value": "3200 to 6500K" + }, + { + "group": "Key Specs", + "label": "Color Modes", + "value": "RGB, Daylight, Tungsten" + }, + { + "group": "Key Specs", + "label": "Color Accuracy Standard", + "value": "CRI 96 | TLCI 97" + }, + { + "group": "Key Specs", + "label": "Dimming", + "value": "Built-In Dimmer |  • 0 to 100%" + }, + { + "group": "Key Specs", + "label": "Front Accessory Mount", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Wireless Remote Control Type", + "value": "Bluetooth" + }, + { + "group": "Key Specs", + "label": "Power Source", + "value": "Battery (Built-In)" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x Rechargeable Lithium-Ion Polymer, 3.7 VDC, 2600 mAh (Built-In) |  • 2-Hour Runtime at Maximum Brightness |  • 15-Hour Runtime at Minimum Brightness |  • 2-Hour Charge Time" + }, + { + "group": "Key Specs", + "label": "Input Power", + "value": "5 VDC at 2 A" + }, + { + "group": "Key Specs", + "label": "Power Consumption", + "value": "5 W" + }, + { + "group": "Key Specs", + "label": "Fixture Mounting", + "value": "1x 1/4\"-20 Female Thread | Magnetic" + }, + { + "group": "Light Fixture", + "label": "Item Type", + "value": "1x LED Light Panel" + }, + { + "group": "Light Fixture", + "label": "Included Filters", + "value": "Diffusion" + }, + { + "group": "Light Fixture", + "label": "Included Storage Case", + "value": "Yes" + }, + { + "group": "Light Fixture", + "label": "Photometrics", + "value": "Unspecified Color Temperature: | 9 fc / 100 Lux at 3.3' / 1 m  | 102 fc / 1100 Lux at 0.98' / 0.3 m | 37 fc / 400 Lux at 1.64' / 0.5 m" + }, + { + "group": "Light Fixture", + "label": "Color Temperature", + "value": "3200 to 6500K" + }, + { + "group": "Light Fixture", + "label": "Color Modes", + "value": "RGB, Daylight, Tungsten" + }, + { + "group": "Light Fixture", + "label": "Color Accuracy Standard", + "value": "CRI 96 | TLCI 97" + }, + { + "group": "Light Fixture", + "label": "Dimming", + "value": "Built-In Dimmer |  • 0 to 100%" + }, + { + "group": "Light Fixture", + "label": "Cooling System", + "value": "No" + }, + { + "group": "Light Fixture", + "label": "Built-In Flash", + "value": "No" + }, + { + "group": "Light Fixture", + "label": "Preprogrammed Effects", + "value": "Yes" + }, + { + "group": "Light Fixture", + "label": "Umbrella Mount", + "value": "No" + }, + { + "group": "Light Fixture", + "label": "Front Accessory Mount", + "value": "No" + }, + { + "group": "Connectivity", + "label": "Wireless Remote Control Type", + "value": "Bluetooth" + }, + { + "group": "Connectivity", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: SIDUSLINK | Functionality: Adjust Settings, Remote Control" + }, + { + "group": "Power & I/O", + "label": "Power Source", + "value": "Battery (Built-In)" + }, + { + "group": "Power & I/O", + "label": "Inputs/Outputs", + "value": "1x USB-C Power Input" + }, + { + "group": "Power & I/O", + "label": "Battery", + "value": "1x Rechargeable Lithium-Ion Polymer, 3.7 VDC, 2600 mAh (Built-In) |  • 2-Hour Runtime at Maximum Brightness |  • 15-Hour Runtime at Minimum Brightness |  • 2-Hour Charge Time" + }, + { + "group": "Power & I/O", + "label": "Battery Charging", + "value": "Charging Cable (Included)" + }, + { + "group": "Power & I/O", + "label": "Input Power", + "value": "5 VDC at 2 A" + }, + { + "group": "Power & I/O", + "label": "Included Adapter / Cable", + "value": "1x USB-C to USB-A Cable" + }, + { + "group": "Power & I/O", + "label": "Power Consumption", + "value": "5 W" + }, + { + "group": "Mounting", + "label": "Fixture Mounting", + "value": "1x 1/4\"-20 Female Thread | Magnetic" + }, + { + "group": "General", + "label": "Display", + "value": "OLED" + }, + { + "group": "General", + "label": "Environmental Resistance", + "value": "No" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 77°F / 0 to 45°C" + }, + { + "group": "General", + "label": "Dimensions", + "value": "3.7 x 2.4 x 0.7\" / 9.3 x 6.1 x 1.7 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "0.29 lb / 130 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.115 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "5.5 x 4.4 x 3.85\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1512600-REG/aputure_mc_rgbww_led_light.html", + "archive_url": "https://web.archive.org/web/20250131004635/https://www.bhphotovideo.com/c/product/1512600-REG/aputure_mc_rgbww_led_light.html", + "archive_timestamp": "20250131004635", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "aputure-softbox-for-nova-p600c-led-panel-24-x-36", + "name": "Aputure Softbox for Nova P600c LED Panel (24 x 36\")", + "brand": "Aputure", + "bh_sku": "APS3179A30", + "mpn": "APS3179A30", + "department_slug": "lighting", + "subcategory_slug": "lighting-kits", + "product_type": "Light", + "price_usd": 149.0, + "availability": "In Stock", + "condition": "New", + "description": "This Aputure Softbox is a 24 x 36\" light-shaping tool specifically designed for the Nova P600c LED panel. The softbox features a highly reflective interior for improved light efficiency, and this medium-sized light modifier increases the overall surface area of the panel to enable a soft, wraparound quality. Suitable for users who want a softer light without losing too much punch or efficiency, the light also includes a 45° light control grid that narrows and concentrates the light's beam for directional control.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Interior Color", + "value": "Silver" + }, + { + "group": "Key Specs", + "label": "Light Compatibility", + "value": "Direct Attachment (Requires No Bracket/Speed Ring): For Aputure Nova P600c" + }, + { + "group": "Key Specs", + "label": "Accepts Grids", + "value": "Yes (Included)" + }, + { + "group": "Key Specs", + "label": "Light Compatibility", + "value": "Direct Attachment (Requires No Bracket/Speed Ring): For Aputure Nova P600c" + }, + { + "group": "Key Specs", + "label": "Quick Open Type", + "value": "Foldable" + }, + { + "group": "Key Specs", + "label": "Accepts Grids", + "value": "Yes (Included)" + }, + { + "group": "Key Specs", + "label": "Removable Front Face", + "value": "Yes" + }, + { + "group": "Key Specs", + "label": "Interior Baffle", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Materials", + "value": "Fabric" + }, + { + "group": "Key Specs", + "label": "Dimensions", + "value": "ø: 26 x H: 20.7\" / ø: 66 x H: 52.5 cm (Closed) | 37.6 x 22.8 x 13\" / 95.5 x 58 x 33 cm (Open)" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "2.95 lb / 1.34 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "4 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "26 x 20.75 x 3.13\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1707412-REG/aputure_aps3179a30_softbox_for_nova_p600c.html", + "archive_url": "https://web.archive.org/web/20250815191812/https://www.bhphotovideo.com/c/product/1707412-REG/aputure_aps3179a30_softbox_for_nova_p600c.html", + "archive_timestamp": "20250815191812", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "bigblue-al450wmt-wide-beam-al1300wp-wide-beam-dive-lights-with-rainbow-clip", + "name": "Bigblue AL450WMT Wide Beam & AL1300WP Wide Beam Dive Lights with Rainbow Clip", + "brand": "Bigblue", + "bh_sku": "BI450WT13WER", + "mpn": "CP-450WT-1300W-EZCR", + "department_slug": "lighting", + "subcategory_slug": "lighting-kits", + "product_type": "Light", + "price_usd": 239.99, + "availability": "In Stock", + "condition": "New", + "description": "This AL450WMT Wide Beam & AL1300WP Wide Beam Dive Lights with Rainbow Clip combo pack from Bigblue meets a wide range of diving needs, and it includes two dive lights and a rainbow-flashing marker, all depth-rated to 328'. The AL450WMT is a compact, 450-lumen, 40° beam LED light that runs on three AAA batteries and turns on and off with a push-button tailcap switch. The rechargeable AL1300WP light delivers a beam angle of 85° with four output levels up to 1300 lumens. Both lights have anticorrosion anodized aluminum housings and are also suitable for use on dry land.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Illumination Source", + "value": "1x White LED" + }, + { + "group": "Key Specs", + "label": "Lumen Output", + "value": "450 Lumens" + }, + { + "group": "Key Specs", + "label": "Color Temperature", + "value": "6500K" + }, + { + "group": "Key Specs", + "label": "Depth Rating", + "value": "328' / 100 m" + }, + { + "group": "Key Specs", + "label": "Switch Type", + "value": "Push-Button Tail Cap" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "3x AAA Alkaline |  • 4-Hour Runtime at 450 Lumens" + }, + { + "group": "Light", + "label": "Illumination Source", + "value": "1x White LED" + }, + { + "group": "Light", + "label": "Lumen Output", + "value": "450 Lumens" + }, + { + "group": "Light", + "label": "Beam Angle", + "value": "40°" + }, + { + "group": "Light", + "label": "Color Temperature", + "value": "6500K" + }, + { + "group": "Light", + "label": "Modes", + "value": "Constant On" + }, + { + "group": "Environmental", + "label": "Depth Rating", + "value": "328' / 100 m" + }, + { + "group": "Environmental", + "label": "Buoyancy", + "value": "-2.5 oz / -72 g (with Batteries)" + }, + { + "group": "General", + "label": "Switch Type", + "value": "Push-Button Tail Cap" + }, + { + "group": "General", + "label": "Battery", + "value": "3x AAA Alkaline |  • 4-Hour Runtime at 450 Lumens" + }, + { + "group": "General", + "label": "Construction", + "value": "Aluminum" + }, + { + "group": "General", + "label": "Dimensions", + "value": "Length: 4.3\" / 10.9 cm | Diameter: 1.4\" / 3.6 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "5.4 oz / 152 g (with Batteries)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.46 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.7 x 2.9 x 2.3\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1609013-REG/bigblue_cp_450wt_1300w_ezcr_al450wm_dive_light_al1300wp.html", + "archive_url": "https://web.archive.org/web/20250613195551/https://www.bhphotovideo.com/c/product/1609013-REG/bigblue_cp_450wt_1300w_ezcr_al450wm_dive_light_al1300wp.html", + "archive_timestamp": "20250613195551", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "fiilex-softbox-for-p3-series-led-lights-12-x-16", + "name": "Fiilex Softbox for P3 Series LED Lights (12 x 16\")", + "brand": "Fiilex", + "bh_sku": "FIFLXP3CLSB1", + "mpn": "FLXP3CLR-SB1", + "department_slug": "lighting", + "subcategory_slug": "lighting-kits", + "product_type": "Light", + "price_usd": 175.0, + "availability": "In Stock", + "condition": "New", + "description": "This 12 x 16\" Softbox for P3 Series LED Lights from Fiilex provides a soft, flattering lighting solution for manageable contrast. It comes complete with a removable inner and front diffuser baffle. Its reflective silver interior maximizes output. A carrying bag is included for protection during storage and transport.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Item Type", + "value": "12 x 16\" Softbox (Rectangular Shape)" + }, + { + "group": "Key Specs", + "label": "Interior Color", + "value": "Silver" + }, + { + "group": "Key Specs", + "label": "Light Compatibility", + "value": "Requires Bracket/Speed Ring (Not Included): For Fiilex P3 COLOR" + }, + { + "group": "Key Specs", + "label": "Accepts Grids", + "value": "Yes (Not Included)" + }, + { + "group": "Key Specs", + "label": "Interior Color", + "value": "Silver" + }, + { + "group": "Key Specs", + "label": "Light Compatibility", + "value": "Requires Bracket/Speed Ring (Not Included): For Fiilex P3 COLOR" + }, + { + "group": "Key Specs", + "label": "Quick Open Type", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Accepts Grids", + "value": "Yes (Not Included)" + }, + { + "group": "Key Specs", + "label": "Removable Front Face", + "value": "Yes" + }, + { + "group": "Key Specs", + "label": "Interior Baffle", + "value": "Yes, Removable" + }, + { + "group": "Key Specs", + "label": "Materials", + "value": "Fabric, Polyester" + }, + { + "group": "Key Specs", + "label": "Dimensions", + "value": "16 x 12\" / 0.4 x 0.3 m" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.6 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "22.2 x 10.7 x 3.9\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1702184-REG/fiilex_flxp3clr_sb1_p3_softbox_12x16.html", + "archive_url": "https://web.archive.org/web/20250806011206/https://www.bhphotovideo.com/c/product/1702184-REG/fiilex_flxp3clr_sb1_p3_softbox_12x16.html", + "archive_timestamp": "20250806011206", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "fotodiox-t660-bi-color-led-softbox-light-2-light-kit", + "name": "FotodioX T660 Bi-Color LED Softbox Light (2-Light Kit)", + "brand": "FotodioX", + "bh_sku": "FODLXT6602", + "mpn": "T660X2", + "department_slug": "lighting", + "subcategory_slug": "lighting-kits", + "product_type": "Light", + "price_usd": 148.71, + "availability": "In Stock", + "condition": "New", + "description": "With an integrated softbox and handle, the T660 Bi-Color LED Softbox Light from FotodioX is ready to go right out of the box. This kit includes two lights, each with a grid and a 6' tall light stand. This versatile light has color temperature variable from 3000 to 6500K while maintaining a CRI of 95 for faithful rendition of colors. Featuring a multifunction push knob on its back, the T660 allows for intuitive local adjustments with eight preset special effects. You can easily hold it yourself or mount it on the included light stand.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Item Type", + "value": "2x LED Softbox Light" + }, + { + "group": "Key Specs", + "label": "Included Light Modifier", + "value": "2x Diffuser | 2x Grid/Louver" + }, + { + "group": "Key Specs", + "label": "Included Storage Case", + "value": "Yes" + }, + { + "group": "Key Specs", + "label": "Photometrics", + "value": "Unspecified Color Temperature: | 668 fc / 7200 Lux at 3.3' / 1 m" + }, + { + "group": "Key Specs", + "label": "Color Temperature", + "value": "3000 to 6500K" + }, + { + "group": "Key Specs", + "label": "Color Modes", + "value": "Daylight, Tungsten" + }, + { + "group": "Key Specs", + "label": "Color Accuracy Standard", + "value": "CRI 95" + }, + { + "group": "Key Specs", + "label": "Dimming", + "value": "Built-In Dimmer |  • 0 to 100%" + }, + { + "group": "Key Specs", + "label": "Front Accessory Mount", + "value": "Proprietary" + }, + { + "group": "Key Specs", + "label": "Power Source", + "value": "AC to DC Adapter (Included) | Battery (Not Included)" + }, + { + "group": "Key Specs", + "label": "Battery Plate Type", + "value": "2x Sony L-Series / NP-F (Built-In)" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "Per Light: 2x Sony-Type L-Series / NP-F Rechargeable (Not Included)" + }, + { + "group": "Key Specs", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "Key Specs", + "label": "Power Consumption", + "value": "60 W" + }, + { + "group": "Key Specs", + "label": "Fixture Mounting", + "value": "1x 5/8\" Receiver" + }, + { + "group": "Light Fixture", + "label": "Item Type", + "value": "2x LED Softbox Light" + }, + { + "group": "Light Fixture", + "label": "Included Light Modifier", + "value": "2x Diffuser | 2x Grid/Louver" + }, + { + "group": "Light Fixture", + "label": "Included Storage Case", + "value": "Yes" + }, + { + "group": "Light Fixture", + "label": "Photometrics", + "value": "Unspecified Color Temperature: | 668 fc / 7200 Lux at 3.3' / 1 m" + }, + { + "group": "Light Fixture", + "label": "Color Temperature", + "value": "3000 to 6500K" + }, + { + "group": "Light Fixture", + "label": "Color Modes", + "value": "Daylight, Tungsten" + }, + { + "group": "Light Fixture", + "label": "Color Accuracy Standard", + "value": "CRI 95" + }, + { + "group": "Light Fixture", + "label": "Dimming", + "value": "Built-In Dimmer |  • 0 to 100%" + }, + { + "group": "Light Fixture", + "label": "Cooling System", + "value": "No" + }, + { + "group": "Light Fixture", + "label": "Expected Lamp Life", + "value": "50,000 Hours" + }, + { + "group": "Light Fixture", + "label": "Built-In Flash", + "value": "No" + }, + { + "group": "Light Fixture", + "label": "Preprogrammed Effects", + "value": "Yes" + }, + { + "group": "Light Fixture", + "label": "Umbrella Mount", + "value": "No" + }, + { + "group": "Light Fixture", + "label": "Front Accessory Mount", + "value": "Proprietary" + }, + { + "group": "Connectivity", + "label": "Mobile App Compatible", + "value": "No" + }, + { + "group": "Power & I/O", + "label": "Power Source", + "value": "AC to DC Adapter (Included) | Battery (Not Included)" + }, + { + "group": "Power & I/O", + "label": "Inputs/Outputs", + "value": "1x Barrel / Coax Power Input" + }, + { + "group": "Power & I/O", + "label": "Battery Plate Type", + "value": "2x Sony L-Series / NP-F (Built-In)" + }, + { + "group": "Power & I/O", + "label": "Battery", + "value": "Per Light: 2x Sony-Type L-Series / NP-F Rechargeable (Not Included)" + }, + { + "group": "Power & I/O", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "Power & I/O", + "label": "Included Adapter / Cable", + "value": "2x USA Type-A/B Plug to Barrel / Coax AC to DC Adapter" + }, + { + "group": "Power & I/O", + "label": "Power Consumption", + "value": "60 W" + }, + { + "group": "Mounting", + "label": "Included Light Stand / Mount", + "value": "2x Light Stand |  • Height: 2.7 to 6' / 0.8 to 1.8 m" + }, + { + "group": "Mounting", + "label": "Fixture Mounting", + "value": "1x 5/8\" Receiver" + }, + { + "group": "General", + "label": "Display", + "value": "Yes" + }, + { + "group": "General", + "label": "Environmental Resistance", + "value": "No" + }, + { + "group": "General", + "label": "Dimensions", + "value": "23.6 x 23.6 x 14.2\" / 59.9 x 59.9 x 36.1 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "2.3 lb / 1 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "14.835 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "22.5 x 18.8 x 10.2\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1801036-REG/fotodiox_t660x2_dlx_ez_light_t660_double.html", + "archive_url": "https://web.archive.org/web/20250125183954/https://www.bhphotovideo.com/c/product/1801036-REG/fotodiox_t660x2_dlx_ez_light_t660_double.html", + "archive_timestamp": "20250125183954", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "fractal-design-scape-light-wireless-rgb-gaming-headset-gray", + "name": "Fractal Design Scape Light Wireless RGB Gaming Headset (Gray)", + "brand": "Fractal Design", + "bh_sku": "FRFDHSSCA102", + "mpn": "FD-HS-SCA1-02", + "department_slug": "lighting", + "subcategory_slug": "lighting-kits", + "product_type": "Light", + "price_usd": 199.99, + "availability": "In Stock", + "condition": "New", + "description": "Delivering rich audio and an elegant design, the Scape Light Wireless RGB Gaming Headset from Fractal Design immerses you in entertainment experiences using a variety of devices while providing long-lasting comfort.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": "Bluetooth 5.3", + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/frfdhssca102.jpg", + "image_sha256": "ed10082bc19b35e33bd5c207161cac2a9ac4fa0f03e840d98ef655da710f24c3", + "specs": [ + { + "group": "Key Specs", + "label": "Wearing Style", + "value": "Dual Ear with Headband" + }, + { + "group": "Key Specs", + "label": "Earpiece Design", + "value": "Over-Ear (Circumaural)" + }, + { + "group": "Key Specs", + "label": "Sound Field", + "value": "Stereo" + }, + { + "group": "Key Specs", + "label": "Built-In Mic", + "value": "Yes (on Adjustable Boom)" + }, + { + "group": "Key Specs", + "label": "Noise Cancelling Microphone", + "value": "Yes" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Bluetooth 5.3" + }, + { + "group": "Key Specs", + "label": "Audio Connector", + "value": "1x USB-C" + }, + { + "group": "Key Specs", + "label": "Platform Support", + "value": "Windows | Mac | PlayStation 4 | PlayStation 5 | Nintendo Switch | Smartphone" + }, + { + "group": "Headphone", + "label": "Wearing Style", + "value": "Dual Ear with Headband" + }, + { + "group": "Headphone", + "label": "Earpiece Design", + "value": "Over-Ear (Circumaural)" + }, + { + "group": "Headphone", + "label": "Open/Closed-Back", + "value": "Closed-Back" + }, + { + "group": "Headphone", + "label": "Sound Field", + "value": "Stereo" + }, + { + "group": "Headphone", + "label": "Driver Size", + "value": "1.6\" / 40 mm" + }, + { + "group": "Headphone", + "label": "Active Noise Cancellation", + "value": "No" + }, + { + "group": "Headphone", + "label": "Frequency Response", + "value": "20 Hz to 20 kHz" + }, + { + "group": "Headphone", + "label": "Volume Limiting / Child-Safe", + "value": "No" + }, + { + "group": "Headphone", + "label": "Built-In Controls", + "value": "Yes (on Both Earpieces): Flip-to-Mute Boom, Play/Pause, Volume" + }, + { + "group": "Headphone", + "label": "Sensors", + "value": "No" + }, + { + "group": "Microphone", + "label": "Built-In Mic", + "value": "Yes (on Adjustable Boom)" + }, + { + "group": "Microphone", + "label": "Noise Cancelling Microphone", + "value": "Yes" + }, + { + "group": "Microphone", + "label": "Number of Voice Mics", + "value": "2" + }, + { + "group": "Microphone", + "label": "Pickup Pattern", + "value": "Omnidirectional" + }, + { + "group": "Microphone", + "label": "Frequency Response", + "value": "50 Hz to 16 kHz" + }, + { + "group": "Connectivity", + "label": "Wireless", + "value": "Bluetooth 5.3" + }, + { + "group": "Connectivity", + "label": "Wireless Range", + "value": "131.2' / 40 m" + }, + { + "group": "Connectivity", + "label": "Supported Audio Codecs", + "value": "LC3" + }, + { + "group": "Connectivity", + "label": "Multipoint Support", + "value": "Yes" + }, + { + "group": "Connectivity", + "label": "Audio Connector", + "value": "1x USB-C" + }, + { + "group": "Connectivity", + "label": "Included Adapter", + "value": "No" + }, + { + "group": "Connectivity", + "label": "Cable Design", + "value": "Detachable" + }, + { + "group": "Connectivity", + "label": "Audio Connector to Earpiece", + "value": "USB-C" + }, + { + "group": "Connectivity", + "label": "Cable Length", + "value": "4.9' / 1.5 m" + }, + { + "group": "Connectivity", + "label": "Base Station / Transmitter I/O", + "value": "1x USB-A - Charging | 1x USB-A - Audio" + }, + { + "group": "Connectivity", + "label": "Platform Support", + "value": "Windows | Mac | PlayStation 4 | PlayStation 5 | Nintendo Switch | Smartphone" + }, + { + "group": "Connectivity", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS" + }, + { + "group": "Battery", + "label": "Runtime", + "value": "40 Hours" + }, + { + "group": "Battery", + "label": "Recharge Time", + "value": "3 Hours" + }, + { + "group": "Charging Case", + "label": "Charging Input", + "value": "USB-C" + }, + { + "group": "Charging Case", + "label": "Wireless Charging", + "value": "Yes" + }, + { + "group": "Physical", + "label": "Color", + "value": "Gray" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "7.7 x 6.3 x 3.3\" / 195 x 160 x 84 mm" + }, + { + "group": "Physical", + "label": "Weight", + "value": "11.9 oz / 338 g (with Microphone) | 11.1 oz / 314 g (without Microphone)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "3.095 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "11.9 x 8.7 x 4.1\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1901248-REG/fractal_design_fd_hs_sca1_02_scape_light_wireless_rgb.html", + "archive_url": "https://web.archive.org/web/20260203034711/https://www.bhphotovideo.com/c/product/1901248-REG/fractal_design_fd_hs_sca1_02_scape_light_wireless_rgb.html", + "archive_timestamp": "20260203034711", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "godox-litemons-la200bi-bi-color-led-2-light-kit-with-stands-and-softboxes", + "name": "Godox Litemons LA200Bi Bi-Color LED 2-Light Kit with Stands and Softboxes", + "brand": "Godox", + "bh_sku": "GOLA200BIKIT", + "mpn": "LA200BI KIT", + "department_slug": "lighting", + "subcategory_slug": "lighting-kits", + "product_type": "Light", + "price_usd": 799.0, + "availability": "In Stock", + "condition": "New", + "description": "Godox has put together this Litemons LA200Bi Bi-Color LED 2-Light Kit with Stands and Softboxes for when you  need a budget-friendly and intuitive lighting setup. This kit features two LA200Bi bi-color LED lights with a variable color temperature range of 2800 to 6500K. Each light comes with a 23.6 x 35.4\" softbox and a 6.5' light stand. A semi-rigid hard case is also supplied for protection during storage and transport.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Item Type", + "value": "1 x LED Monolight" + }, + { + "group": "Key Specs", + "label": "Included Storage Case", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Photometrics", + "value": ": | 6475 fc / 69,700 Lux at 3.3' / 1 m* | | *Standardized Measurement Supplied by the Manufacturer" + }, + { + "group": "Key Specs", + "label": "Color Temperature", + "value": "2800 to 6500K" + }, + { + "group": "Key Specs", + "label": "Color Modes", + "value": "Daylight, Tungsten" + }, + { + "group": "Key Specs", + "label": "Color Accuracy Standard", + "value": "CRI 96 at 5600K | TLCI 97 at 5600K" + }, + { + "group": "Key Specs", + "label": "Dimming", + "value": "Built-In Dimmer (Continuous) |  • 0 to 100%" + }, + { + "group": "Key Specs", + "label": "Front Accessory Mount", + "value": "Bowens S" + }, + { + "group": "Key Specs", + "label": "Wireless Remote Control Type", + "value": "Bluetooth" + }, + { + "group": "Key Specs", + "label": "Power Source", + "value": "AC to DC Adapter (Included)" + }, + { + "group": "Key Specs", + "label": "Power Consumption", + "value": "230 W" + }, + { + "group": "Light Fixture", + "label": "Item Type", + "value": "1 x LED Monolight" + }, + { + "group": "Light Fixture", + "label": "Included Storage Case", + "value": "No" + }, + { + "group": "Light Fixture", + "label": "Photometrics", + "value": ": | 6475 fc / 69,700 Lux at 3.3' / 1 m* | | *Standardized Measurement Supplied by the Manufacturer" + }, + { + "group": "Light Fixture", + "label": "Color Temperature", + "value": "2800 to 6500K" + }, + { + "group": "Light Fixture", + "label": "Color Modes", + "value": "Daylight, Tungsten" + }, + { + "group": "Light Fixture", + "label": "Color Accuracy Standard", + "value": "CRI 96 at 5600K | TLCI 97 at 5600K" + }, + { + "group": "Light Fixture", + "label": "Dimming", + "value": "Built-In Dimmer (Continuous) |  • 0 to 100%" + }, + { + "group": "Light Fixture", + "label": "Cooling System", + "value": "Fan" + }, + { + "group": "Light Fixture", + "label": "Umbrella Mount", + "value": "Yes" + }, + { + "group": "Light Fixture", + "label": "Front Accessory Mount", + "value": "Bowens S" + }, + { + "group": "Connectivity", + "label": "Wireless Remote Control Type", + "value": "Bluetooth" + }, + { + "group": "Connectivity", + "label": "Wireless Range", + "value": "98.4' / 30 m" + }, + { + "group": "Power & I/O", + "label": "Power Source", + "value": "AC to DC Adapter (Included)" + }, + { + "group": "Power & I/O", + "label": "Inputs/Outputs", + "value": "1 x XLR 3-Pin Power Input" + }, + { + "group": "Power & I/O", + "label": "Inline Switch", + "value": "No" + }, + { + "group": "Power & I/O", + "label": "Power Pass-Thru", + "value": "No" + }, + { + "group": "Power & I/O", + "label": "Power Consumption", + "value": "230 W" + }, + { + "group": "Environmental", + "label": "Operating Temperature", + "value": "14 to 104°F / -10 to 40°C" + }, + { + "group": "General", + "label": "Display", + "value": "Yes" + }, + { + "group": "General", + "label": "Dimensions", + "value": "8.5 x 8.1 x 5.7\" / 21.5 x 20.5 x 14.5 cm (Fixture)" + }, + { + "group": "General", + "label": "Weight", + "value": "3.1 lb / 1.4 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "7.455 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "14.5 x 9.3 x 8.3\"" + }, + { + "group": "Packaging Info", + "label": "Wheels", + "value": "Not Compatible" + }, + { + "group": "Packaging Info", + "label": "Air Cushioned", + "value": "No" + }, + { + "group": "Packaging Info", + "label": "Detachable Base", + "value": "No" + }, + { + "group": "Packaging Info", + "label": "Leveling Leg", + "value": "Yes" + }, + { + "group": "Packaging Info", + "label": "Reverse Legs", + "value": "No" + }, + { + "group": "Packaging Info", + "label": "Column Diameter", + "value": "0.98\" / 2.5 cm" + }, + { + "group": "Packaging Info", + "label": "Number of Sections", + "value": "3" + }, + { + "group": "Packaging Info", + "label": "Finish", + "value": "Black" + }, + { + "group": "Packaging Info", + "label": "Material", + "value": "Aluminum" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.65 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "29.5 x 3.5 x 3.5\"" + }, + { + "group": "Key Specs", + "label": "Item Type", + "value": "23.6 x 35.4\" Softbox (Rectangular Shape)" + }, + { + "group": "Key Specs", + "label": "Interior Color", + "value": "Silver" + }, + { + "group": "Key Specs", + "label": "Light Compatibility", + "value": "Includes Speed Ring with Bowens S Mount" + }, + { + "group": "Key Specs", + "label": "Accepts Grids", + "value": "Yes (Not Included)" + }, + { + "group": "Key Specs", + "label": "Interior Color", + "value": "Silver" + }, + { + "group": "Key Specs", + "label": "Light Compatibility", + "value": "Includes Speed Ring with Bowens S Mount" + }, + { + "group": "Key Specs", + "label": "Quick Open Type", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Accepts Grids", + "value": "Yes (Not Included)" + }, + { + "group": "Key Specs", + "label": "Removable Front Face", + "value": "Yes" + }, + { + "group": "Key Specs", + "label": "Interior Baffle", + "value": "Yes, Removable" + }, + { + "group": "Key Specs", + "label": "Materials", + "value": "Aluminum, Fabric" + }, + { + "group": "Key Specs", + "label": "Dimensions", + "value": "35.4 x 23.6\" / 90 x 60 cm" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "3 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "26 x 9 x 2\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1700158-REG/godox_la200bi_kit_litemons_la200bi_2_light_kit.html", + "archive_url": "https://web.archive.org/web/20250118104615/https://www.bhphotovideo.com/c/product/1700158-REG/godox_la200bi_kit_litemons_la200bi_2_light_kit.html", + "archive_timestamp": "20250118104615", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "godox-umbrella-style-softbox-with-bowens-mount-70-8", + "name": "Godox Umbrella-Style Softbox with Bowens Mount (70.8\")", + "brand": "Godox", + "bh_sku": "GOULBOCTA180", + "mpn": "UL-BOX-OCTA-180", + "department_slug": "lighting", + "subcategory_slug": "lighting-kits", + "product_type": "Light", + "price_usd": 109.0, + "availability": "In Stock", + "condition": "New", + "description": "Godox wants to make your lighting setup easier by launching the 70.8\" Umbrella-Style Softbox with Bowens Mount. This octa-shaped softbox has an intuitive design that simplifies your process in the studio or on the go. The umbrella-style mechanism allows you to quickly open the softbox, break down, and keep moving. Good for various types of photo or video work, this softbox renders a flattering quality of light while providing directional control of the output when combined with the included grid. The modifier features a popular standard Bowens mount that fits a wide range of fixtures. The UL series is well-suited for wedding, editorial, or location work.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Item Type", + "value": "Softbox (8-Sided Octagon Shape)" + }, + { + "group": "Key Specs", + "label": "Interior Color", + "value": "Silver" + }, + { + "group": "Key Specs", + "label": "Light Compatibility", + "value": "Built-In Speed Ring with Bowens S Mount" + }, + { + "group": "Key Specs", + "label": "Accepts Grids", + "value": "Yes (Included)" + }, + { + "group": "Key Specs", + "label": "Item Type", + "value": "Softbox (8-Sided Octagon Shape)" + }, + { + "group": "Key Specs", + "label": "Interior Color", + "value": "Silver" + }, + { + "group": "Key Specs", + "label": "Light Compatibility", + "value": "Built-In Speed Ring with Bowens S Mount" + }, + { + "group": "Key Specs", + "label": "Quick Open Type", + "value": "Umbrella Style" + }, + { + "group": "Key Specs", + "label": "Accepts Grids", + "value": "Yes (Included)" + }, + { + "group": "Key Specs", + "label": "Removable Front Face", + "value": "Yes" + }, + { + "group": "Key Specs", + "label": "Interior Baffle", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Materials", + "value": "Fabric, Metal" + }, + { + "group": "Key Specs", + "label": "Dimensions", + "value": "ø: 70.9 x H: 26.6\" / ø: 180 x H: 67.5 cm" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "7.5 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "50 x 7 x 3\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1912203-REG/godox_ul_box_octa_180_unbrella_softbox_with.html", + "archive_url": "https://web.archive.org/web/20260314101447/https://www.bhphotovideo.com/c/product/1912203-REG/godox_ul_box_octa_180_unbrella_softbox_with.html", + "archive_timestamp": "20260314101447", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "rotolight-titan-x2-rgb-led-light-panel-standard-yoke", + "name": "Rotolight Titan X2 RGB+ LED Light Panel (Standard Yoke)", + "brand": "Rotolight", + "bh_sku": "RORLTITANX2Y", + "mpn": "RL-TITAN-X2-Y", + "department_slug": "lighting", + "subcategory_slug": "lighting-kits", + "product_type": "Light", + "price_usd": 1279.3, + "availability": "In Stock", + "condition": "New", + "description": "Look to the Titan X2 LED DMX Light Panel from Rotolight for a truly powerful yet soft, flicker-free output with precision color accuracy and versatile control for both video and photographic use. This 2 x 1' yoke mounted panel features a sleek yet robust design, a wide range of built-in presets and effects, and SmartSoft technology for electronically adjustable diffusion without additional gels or softboxes.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Item Type", + "value": "1x LED Light Panel" + }, + { + "group": "Key Specs", + "label": "Included Storage Case", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Photometrics", + "value": "3200K: | 1442 fc / 15,525 Lux at 3.3' / 1 m  | 206 fc / 2220 Lux at 9.8' / 3 m | 88 fc / 953 Lux at 16.4' / 5 m | 5600K: | 1560 fc / 16,800 Lux at 3.3' / 1 m  | 224 fc / 2415 Lux at 9.8' / 3 m | 91 fc / 983 Lux at 16.4' / 5 m" + }, + { + "group": "Key Specs", + "label": "Color Temperature", + "value": "2800 to 10,000K" + }, + { + "group": "Key Specs", + "label": "Color Modes", + "value": "RGB, Daylight, Tungsten" + }, + { + "group": "Key Specs", + "label": "Color Accuracy Standard", + "value": "CRI 95 at 5600K | CRI 95 at 3200K | TLCI 98" + }, + { + "group": "Key Specs", + "label": "Dimming", + "value": "Built-In Dimmer (Continuous) |  • 0 to 100%" + }, + { + "group": "Key Specs", + "label": "Front Accessory Mount", + "value": "Proprietary" + }, + { + "group": "Key Specs", + "label": "Wireless Remote Control Type", + "value": "Bluetooth | Wireless CRMX | Proprietary Wireless (Elinchrom Skyport)" + }, + { + "group": "Key Specs", + "label": "Power Source", + "value": "AC Power (Cable Included) *Requires Power Supply/Controller (Included)" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x Proprietary Rechargeable, 20.5 to 26 VDC (Not Included)" + }, + { + "group": "Key Specs", + "label": "Input Power", + "value": "24 VDC | 110 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "Key Specs", + "label": "Power Consumption", + "value": "420 W" + }, + { + "group": "Key Specs", + "label": "Fixture Mounting", + "value": "1x 1-1/8\" Stud (Via Yoke Mount)" + }, + { + "group": "Light Fixture", + "label": "Item Type", + "value": "1x LED Light Panel" + }, + { + "group": "Light Fixture", + "label": "Included Filters", + "value": "Diffusion (Built-In)" + }, + { + "group": "Light Fixture", + "label": "Included Storage Case", + "value": "No" + }, + { + "group": "Light Fixture", + "label": "Photometrics", + "value": "3200K: | 1442 fc / 15,525 Lux at 3.3' / 1 m  | 206 fc / 2220 Lux at 9.8' / 3 m | 88 fc / 953 Lux at 16.4' / 5 m | 5600K: | 1560 fc / 16,800 Lux at 3.3' / 1 m  | 224 fc / 2415 Lux at 9.8' / 3 m | 91 fc / 983 Lux at 16.4' / 5 m" + }, + { + "group": "Light Fixture", + "label": "Color Temperature", + "value": "2800 to 10,000K" + }, + { + "group": "Light Fixture", + "label": "Color Modes", + "value": "RGB, Daylight, Tungsten" + }, + { + "group": "Light Fixture", + "label": "Color Accuracy Standard", + "value": "CRI 95 at 5600K | CRI 95 at 3200K | TLCI 98" + }, + { + "group": "Light Fixture", + "label": "Dimming", + "value": "Built-In Dimmer (Continuous) |  • 0 to 100%" + }, + { + "group": "Light Fixture", + "label": "Cooling System", + "value": "No" + }, + { + "group": "Light Fixture", + "label": "Expected Lamp Life", + "value": "50,000 Hours" + }, + { + "group": "Light Fixture", + "label": "Beam Angle", + "value": "68 to 150°" + }, + { + "group": "Light Fixture", + "label": "Built-In Flash", + "value": "Yes" + }, + { + "group": "Light Fixture", + "label": "Preprogrammed Effects", + "value": "Yes" + }, + { + "group": "Light Fixture", + "label": "Umbrella Mount", + "value": "No" + }, + { + "group": "Light Fixture", + "label": "Front Accessory Mount", + "value": "Proprietary" + }, + { + "group": "Connectivity", + "label": "Wireless Remote Control Type", + "value": "Bluetooth | Wireless CRMX | Proprietary Wireless (Elinchrom Skyport)" + }, + { + "group": "Connectivity", + "label": "Mobile App Compatible", + "value": "Yes: iOS Only | App Name: Luminair" + }, + { + "group": "Connectivity", + "label": "Wireless Range", + "value": "30' / 9.1 m" + }, + { + "group": "Power & I/O", + "label": "Power Source", + "value": "AC Power (Cable Included) *Requires Power Supply/Controller (Included)" + }, + { + "group": "Power & I/O", + "label": "Inputs/Outputs", + "value": "Light Fixture | 1x speakON Power Input (24 VDC) | Power Supply/Controller | 1x powerCON TRUE1 AC Power Input | 1x powerCON TRUE1 AC Power Output | 1x speakON Power Output (24 VDC)" + }, + { + "group": "Power & I/O", + "label": "Battery", + "value": "1x Proprietary Rechargeable, 20.5 to 26 VDC (Not Included)" + }, + { + "group": "Power & I/O", + "label": "Input Power", + "value": "24 VDC | 110 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "Power & I/O", + "label": "Included Adapter / Cable", + "value": "1x USA Type-A/B to powerCON TRUE1 Cable | 1x speakON to speakON Cable" + }, + { + "group": "Power & I/O", + "label": "Inline Switch", + "value": "No" + }, + { + "group": "Power & I/O", + "label": "Power Pass-Thru", + "value": "Yes" + }, + { + "group": "Power & I/O", + "label": "Power Consumption", + "value": "420 W" + }, + { + "group": "Mounting", + "label": "Yoke Type", + "value": "Manually-Operated Yoke (90° Tilt)" + }, + { + "group": "Mounting", + "label": "Fixture Mounting", + "value": "1x 1-1/8\" Stud (Via Yoke Mount)" + }, + { + "group": "General", + "label": "Display", + "value": "Touchscreen LCD" + }, + { + "group": "General", + "label": "Environmental Resistance", + "value": "Dust-Resistant (IP20)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "-4 to 113°F / -20 to 45°C" + }, + { + "group": "General", + "label": "Certifications", + "value": "CE, FCC, TUV, UL" + }, + { + "group": "General", + "label": "Materials", + "value": "Metal (Housing)" + }, + { + "group": "General", + "label": "Dimensions", + "value": "14.9 x 5.6 x 3.2\" / 37.9 x 14.1 x 8.2 cm (Power Adapter) | 27.8 x 13.8 x 5.9\" / 70.5 x 35 x 15 cm (Fixture)" + }, + { + "group": "General", + "label": "Weight", + "value": "8.2 lb / 3.7 kg (Power Supply/Controller) | 29.9 lb / 13.6 kg (Fixture with Yoke)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "52.15 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "34.5 x 22.75 x 17\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1505357-REG/rotolight_rl_titan_x2_y_titan_x2_led_light.html", + "archive_url": "https://web.archive.org/web/20250516074344/https://www.bhphotovideo.com/c/product/1505357-REG/rotolight_rl_titan_x2_y_titan_x2_led_light.html", + "archive_timestamp": "20250516074344", + "fetched_at": "2026-09-12T17:27:26Z" + } + }, + { + "slug": "transparent-portable-bluetooth-light-speaker-black", + "name": "Transparent Portable Bluetooth Light Speaker (Black)", + "brand": "Transparent", + "bh_sku": "TRLSB", + "mpn": "LS-B", + "department_slug": "lighting", + "subcategory_slug": "lighting-kits", + "product_type": "Light", + "price_usd": 350.0, + "availability": "In Stock", + "condition": "New", + "description": "Gather around the \"fire\" and enjoy your favorite music anywhere with the Portable Bluetooth Light Speaker from Transparent in black. The Light Speaker combines the vintage aesthetic of a glass lantern with the modern technology of a Bluetooth speaker. Inside the aluminum and borosilicate glass is a top LED light and bottom vibrating LED diffuser lens. Both work together to simulate a real flickering flame. Your streaming music is emitted by the omnidirectional 2.5\" full-range driver in the domed top, for 360° of sound. Together with a 3\" passive radiator, the light speaker supplies an open sound with rich bass and crisp details.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Power Output", + "value": "1x 5 W" + }, + { + "group": "Key Specs", + "label": "Drivers", + "value": "1x 2.5\" / 63.5 mm Full-Range" + }, + { + "group": "Key Specs", + "label": "Frequency Response", + "value": "60 Hz to 18 kHz" + }, + { + "group": "Key Specs", + "label": "Bluetooth", + "value": "5.0" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "Speaker System", + "label": "Power Output", + "value": "1x 5 W" + }, + { + "group": "Speaker System", + "label": "Drivers", + "value": "1x 2.5\" / 63.5 mm Full-Range" + }, + { + "group": "Speaker System", + "label": "Passive Radiators", + "value": "1" + }, + { + "group": "Speaker System", + "label": "Frequency Response", + "value": "60 Hz to 18 kHz" + }, + { + "group": "Bluetooth Connectivity", + "label": "Bluetooth", + "value": "5.0" + }, + { + "group": "Wired Connectivity", + "label": "Inputs/Outputs", + "value": "1x 1/8\" / 3.5 mm Stereo Input | 1x USB-C (Power) Input" + }, + { + "group": "Power", + "label": "Battery Capacity", + "value": "3500 mAh" + }, + { + "group": "Power", + "label": "Battery Chemistry", + "value": "Lithium-Ion" + }, + { + "group": "Power", + "label": "Estimated Battery Life", + "value": "10 Hours" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black" + }, + { + "group": "Physical", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "Physical", + "label": "Environmental Resistance", + "value": "Water-Resistant (IPX2)" + }, + { + "group": "Physical", + "label": "Material", + "value": "Aluminum" + }, + { + "group": "Physical", + "label": "Dimensions (W x H x D)", + "value": "4.1 x 6.3\" / 105 x 160 mm" + }, + { + "group": "Physical", + "label": "Weight", + "value": "1.3 lb / 0.6 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.72 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "9.15 x 5.05 x 5.05\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1703373-REG/transparent_ls_b_transparent_light_speaker_black.html", + "archive_url": "https://web.archive.org/web/20250805135530/https://www.bhphotovideo.com/c/product/1703373-REG/transparent_ls_b_transparent_light_speaker_black.html", + "archive_timestamp": "20250805135530", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "westcott-fj400-400ws-strobe-with-ac-dc-battery-us-no-america-plug", + "name": "Westcott FJ400 400Ws Strobe with AC/DC Battery (US/No. America Plug)", + "brand": "Westcott", + "bh_sku": "WEFJ400S", + "mpn": "4700", + "department_slug": "lighting", + "subcategory_slug": "lighting-kits", + "product_type": "Light", + "price_usd": 499.9, + "availability": "In Stock", + "condition": "New", + "description": "Westcott continues to push the envelope with the introduction of the FJ400 400Ws Strobe with AC/DC Battery. This version of the flash head has a power cord with a plug that's designed for use in the US and North America. The flash head recycles in just 0.9 seconds at full power - an impressive spec for a battery-powered light. Its 9-stop power range makes it readily adaptable to a variety of situations, as do High Speed Sync, Rear Curtain Sync, and TTL capability. Speaking of TTL, the FJ400 radio receiver is compatible with many Canon, Nikon, Sony (with adapter), FUJIFILM, Panasonic Lumix, and Olympus cameras, as well as the Canon RT flash system. With separate purchase of the FJ-X2m Universal Wireless Trigger, you can make power and exposure compensation adjustments at distances up to 985'. The wireless system offers 32 channels with six groups to prevent interference with other photographers or to shoot several individual setups.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": "2.4 GHz Radio/RF", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Item Type", + "value": "1x Monolight" + }, + { + "group": "Key Specs", + "label": "Includes Flash Tube", + "value": "Yes" + }, + { + "group": "Key Specs", + "label": "Included Light Modifier", + "value": "1x Reflector" + }, + { + "group": "Key Specs", + "label": "Included Storage Case", + "value": "Yes" + }, + { + "group": "Key Specs", + "label": "Power Range", + "value": "400 Ws |" + }, + { + "group": "Key Specs", + "label": "Power Control", + "value": "9-Stop Range" + }, + { + "group": "Key Specs", + "label": "TTL Metering", + "value": "Yes, via Non-Included Transmitter (Canon E-TTL / E-TTL II, FUJIFILM TTL, Four Thirds TTL, Nikon i-TTL, Sony ADI / P-TTL)" + }, + { + "group": "Key Specs", + "label": "Modeling Light", + "value": "LED Built-In (5600K)" + }, + { + "group": "Key Specs", + "label": "Wireless Remote Control Type", + "value": "Radio/RF Receiver Built-In | Optical Receiver Built-In" + }, + { + "group": "Key Specs", + "label": "Sync Speed", + "value": "1/8000 Sec (High-Speed)" + }, + { + "group": "Key Specs", + "label": "Power Source", + "value": "AC to DC Adapter (Included) | Battery (Included)" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "1x Barrel / Coax Female Flash Sync Input | 1x USB-C Female Firmware Input" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x Rechargeable Lithium-Ion Polymer, 16.8 VDC, 4400 mAh (Included) |  • 480 Flashes at Maximum Brightness |  • 2.5-Hour Charge Time" + }, + { + "group": "Key Specs", + "label": "Fixture Mounting", + "value": "Not Specified by Manufacturer" + }, + { + "group": "Light Fixture", + "label": "Item Type", + "value": "1x Monolight" + }, + { + "group": "Light Fixture", + "label": "Includes Flash Tube", + "value": "Yes" + }, + { + "group": "Light Fixture", + "label": "Included Light Modifier", + "value": "1x Reflector" + }, + { + "group": "Light Fixture", + "label": "Included Filters", + "value": "Color" + }, + { + "group": "Light Fixture", + "label": "Included Storage Case", + "value": "Yes" + }, + { + "group": "Light Fixture", + "label": "Power Range", + "value": "400 Ws |" + }, + { + "group": "Light Fixture", + "label": "Power Control", + "value": "9-Stop Range" + }, + { + "group": "Light Fixture", + "label": "Color Temperature", + "value": "5500K +/- 150K" + }, + { + "group": "Light Fixture", + "label": "Flash Ready Indicator", + "value": "No" + }, + { + "group": "Light Fixture", + "label": "TTL Metering", + "value": "Yes, via Non-Included Transmitter (Canon E-TTL / E-TTL II, FUJIFILM TTL, Four Thirds TTL, Nikon i-TTL, Sony ADI / P-TTL)" + }, + { + "group": "Light Fixture", + "label": "Umbrella Mount", + "value": "Yes" + }, + { + "group": "Light Fixture", + "label": "Front Accessory Mount", + "value": "Bowens S" + }, + { + "group": "Light Fixture", + "label": "Replaceable Flash Tube", + "value": "Yes (User Replaceable)" + }, + { + "group": "Modeling Light", + "label": "Modeling Light", + "value": "LED Built-In (5600K)" + }, + { + "group": "Modeling Light", + "label": "On/Off Switch", + "value": "Yes" + }, + { + "group": "Connectivity", + "label": "Wireless", + "value": "2.4 GHz Radio/RF" + }, + { + "group": "Connectivity", + "label": "Wireless Remote Control Type", + "value": "Radio/RF Receiver Built-In | Optical Receiver Built-In" + }, + { + "group": "Connectivity", + "label": "Mobile App Compatible", + "value": "Yes, Adapter Required (Not Included): Android & iOS | App Name: Westcott" + }, + { + "group": "Connectivity", + "label": "Wireless Channels", + "value": "32" + }, + { + "group": "Connectivity", + "label": "Wireless Groups", + "value": "6" + }, + { + "group": "Connectivity", + "label": "Wireless Frequency", + "value": "2.4 GHz" + }, + { + "group": "Connectivity", + "label": "Wireless Range", + "value": "985' / 300.2 m (Radio/RF)" + }, + { + "group": "Connectivity", + "label": "Flash Duration", + "value": "1/19,000 Sec" + }, + { + "group": "Connectivity", + "label": "Sync Speed", + "value": "1/8000 Sec (High-Speed)" + }, + { + "group": "Power & I/O", + "label": "Power Source", + "value": "AC to DC Adapter (Included) | Battery (Included)" + }, + { + "group": "Power & I/O", + "label": "Inputs/Outputs", + "value": "1x Barrel / Coax Female Flash Sync Input | 1x USB-C Female Firmware Input" + }, + { + "group": "Power & I/O", + "label": "Battery", + "value": "1x Rechargeable Lithium-Ion Polymer, 16.8 VDC, 4400 mAh (Included) |  • 480 Flashes at Maximum Brightness |  • 2.5-Hour Charge Time" + }, + { + "group": "Power & I/O", + "label": "Battery Charging", + "value": "1x AC to DC Adapter (Included)" + }, + { + "group": "Power & I/O", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "Power & I/O", + "label": "Included Adapter / Cable", + "value": "1x USA Type-A/B to Barrel / Coax Male AC to DC Adapter | 1x USB-A Male to USB-C Male Cable" + }, + { + "group": "Power & I/O", + "label": "Circuit Protection", + "value": "No" + }, + { + "group": "Mounting", + "label": "Fixture Mounting", + "value": "Not Specified by Manufacturer" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "10.58 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "13.3 x 12.5 x 7.5\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1504932-REG/westcott_4700_fj400_400ws_strobe_with.html", + "archive_url": "https://web.archive.org/web/20250118181909/https://www.bhphotovideo.com/c/product/1504932-REG/westcott_4700_fj400_400ws_strobe_with.html", + "archive_timestamp": "20250118181909", + "fetched_at": "2026-09-12T17:27:26Z" + } + }, + { + "slug": "7artisans-25mm-f-1-8-lens-nikon-z-black", + "name": "7Artisans 25mm f/1.8 Lens (Nikon Z, Black)", + "brand": "7Artisans", + "bh_sku": "7A2518NZ", + "mpn": "A105B", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 73.6, + "availability": "In Stock", + "condition": "New", + "description": "Compact and versatile, the black Nikon Z-mount 25mm f/1.8 from 7artisans Photoelectric is an all-manual lens well-suited for portraiture, reportage, and everyday shooting requiring a natural field of view. The bright f/1.8 maximum aperture benefits working in a variety of lighting conditions and offers greater control over depth of field for isolating subjects with selective focus. Multilayer coatings have been applied to individual glass elements to suppress flare and ghosting for improved contrast and color fidelity when working in strong lighting conditions. Additionally, a rounded 12-blade diaphragm produces a pleasing bokeh quality.", + "mount_type": "Nikon Z", + "sensor_size": null, + "focal_length": "25mm (35mm Equivalent: 37.5mm)", + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Specifications", + "label": "Focal Length", + "value": "25mm (35mm Equivalent: 37.5mm)" + }, + { + "group": "Specifications", + "label": "Aperture", + "value": "Maximum: f/1.8 | Minimum: f/16" + }, + { + "group": "Specifications", + "label": "Lens Mount", + "value": "Nikon Z" + }, + { + "group": "Specifications", + "label": "Lens Format Coverage", + "value": "APS-C" + }, + { + "group": "Specifications", + "label": "Minimum Focus Distance", + "value": "7.09\" / 18 cm" + }, + { + "group": "Specifications", + "label": "Optical Design", + "value": "7 Elements in 5 Groups" + }, + { + "group": "Specifications", + "label": "Aperture/Iris Blades", + "value": "12, Rounded" + }, + { + "group": "Specifications", + "label": "Focus Type", + "value": "Manual Focus" + }, + { + "group": "Specifications", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Specifications", + "label": "Filter Size", + "value": "46 mm (Front)" + }, + { + "group": "Specifications", + "label": "Dimensions", + "value": "ø: 2.01 x L: 1.26\" / ø: 51 x L: 32 mm" + }, + { + "group": "Specifications", + "label": "Weight", + "value": "5.04 oz / 143 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.68 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "4.8 x 4.1 x 2.8\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1802989-REG/7artisans_photoelectric_a105b_25mm_f_1_8_lens_for.html", + "archive_url": "https://web.archive.org/web/20250905222542/https://www.bhphotovideo.com/c/product/1802989-REG/7artisans_photoelectric_a105b_25mm_f_1_8_lens_for.html", + "archive_timestamp": "20250905222542", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "7artisans-6mm-f-2-fisheye-lens-micro-four-thirds", + "name": "7Artisans 6mm f/2 Fisheye Lens (Micro Four Thirds)", + "brand": "7Artisans", + "bh_sku": "7A6F2BM", + "mpn": "6F2B-M", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 199.0, + "availability": "In Stock", + "condition": "New", + "description": "This 7Artisans 6mm f/2 Fisheye Lens is built for APS-C sensors and delivers a 220° angle of view, producing dramatic fisheye distortion and fully immersive panoramic compositions. Designed as a manual-focus prime, it offers precise, responsive control for users who prefer hands-on operation.", + "mount_type": "Micro Four Thirds", + "sensor_size": null, + "focal_length": "6mm", + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/7a6f2bm.jpg", + "image_sha256": "5839c9d9a2ddcddcd43021282674f0ac7056096a72b12361f94637f4a96a95d0", + "specs": [ + { + "group": "Specifications", + "label": "Focal Length", + "value": "6mm" + }, + { + "group": "Specifications", + "label": "Aperture", + "value": "Maximum: f/2 | Minimum: f/16" + }, + { + "group": "Specifications", + "label": "Lens Mount", + "value": "Micro Four Thirds" + }, + { + "group": "Specifications", + "label": "Lens Format Coverage", + "value": "APS-C" + }, + { + "group": "Specifications", + "label": "Angle of View", + "value": "220°" + }, + { + "group": "Specifications", + "label": "Minimum Focus Distance", + "value": "3.9\" / 0.1 m" + }, + { + "group": "Specifications", + "label": "Optical Design", + "value": "10 Elements in 8 Groups" + }, + { + "group": "Specifications", + "label": "Aperture/Iris Blades", + "value": "9" + }, + { + "group": "Specifications", + "label": "Focus Type", + "value": "Manual Focus" + }, + { + "group": "Specifications", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Specifications", + "label": "Dimensions", + "value": "ø: 2.7 x L: 3\" / ø: 69 x L: 76 mm" + }, + { + "group": "Specifications", + "label": "Weight", + "value": "14.7 oz / 418 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.265 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "4.5 x 4.2 x 4.1\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1934081-REG/7artisans_6f2b_m_manual_fisheye_lens.html", + "archive_url": "https://web.archive.org/web/20260218075636/https://www.bhphotovideo.com/c/product/1934081-REG/7artisans_6f2b_m_manual_fisheye_lens.html", + "archive_timestamp": "20260218075636", + "fetched_at": "2026-09-12T17:27:30Z" + } + }, + { + "slug": "colbor-cpl-80-projection-lens-adapter", + "name": "COLBOR CPL-80 Projection Lens Adapter", + "brand": "COLBOR", + "bh_sku": "COCPL80", + "mpn": "CPL-80", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 159.99, + "availability": "In Stock", + "condition": "New", + "description": "The CPL-80 Projection Lens Adapter from Colbor is a versatile light modifier that offers precise control and produces dramatic yet clean beams of light. It allows for precise shaping of colorful light, focusing it into a tighter beam with extended reach using shaped gobos and colored gel filters. It features a Bowens mount design that enables effortless attachment to CL220 and CL330 LED video lights, as well as other video lights that are compatible with Bowen mount accessories. It has a solid, durable aluminum alloy housing to provide long-lasting usability. The kit comes complete with 12 differently shaped gobos and 4 colored gel filters to help simulate cinematic light for content creation. The unique gear-shaped design provides a cool grip, allowing it to be handled comfortably in high-temperature conditions without burning your hands.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "General", + "label": "Compatibility", + "value": "Colbor CL Series CL220,CL330 Monolights" + }, + { + "group": "Physical", + "label": "Mounting", + "value": "Back: 1x Bowens S" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black" + }, + { + "group": "Physical", + "label": "Material of Construction", + "value": "Aluminum, Glass" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "9.1 x 4.8\" / 230 x 122 mm (Folded) | 12 x 4.8\" / 305 x 122 mm (Extended)" + }, + { + "group": "Physical", + "label": "Weight", + "value": "2.9 lb / 1.3 kg (Without accessories)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "3.465 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "11.1 x 7 x 6.9\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1801898-REG/colbor_cpl_80_projection_lens.html", + "archive_url": "https://web.archive.org/web/20250806175555/https://www.bhphotovideo.com/c/product/1801898-REG/colbor_cpl_80_projection_lens.html", + "archive_timestamp": "20250806175555", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "dzofilm-vespid-100mm-t2-1-lens-pl-ef-mounts", + "name": "DZOFilm VESPID 100mm T2.1 Lens (PL & EF Mounts)", + "brand": "DZOFilm", + "bh_sku": "DZ100VPL", + "mpn": "DZO-V10021PL", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 799.0, + "availability": "In Stock", + "condition": "New", + "description": "Relatively small and lightweight, the DZOFilm VESPID 100mm T2.1 Lens is part of the VESPID series of lenses from DZOFilm and is well suited for independent and high-end full-frame cinematography. The lens has an 80mm front diameter, allowing it to work with virtually any cine-style matte box. The small size makes this lens an attractive option when working with drones and gimbals, as well as when shooting handheld or run-and-gun. The interchangeable PL mount and included EF mount allow you to use the fully manual lens on a variety of modern and vintage cine cameras, while the full-frame coverage supports sensors that have an image circle up to 46.5mm for use on cameras with sensors up to full-frame without vignetting..", + "mount_type": "ARRI PL with Included Adapter", + "sensor_size": null, + "focal_length": "100mm", + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/dz100vpl.jpg", + "image_sha256": "774bceaa94ac04567340290b0f1fdb77f0106302d48d09c70cd00ab8763ee42f", + "specs": [ + { + "group": "Key Specs", + "label": "Focal Length", + "value": "100mm" + }, + { + "group": "Key Specs", + "label": "Maximum Aperture", + "value": "T2.1" + }, + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "ARRI PL with Included Adapter" + }, + { + "group": "Key Specs", + "label": "Lens Format Coverage", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Filter Thread", + "value": "77 mm" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Electronic Communication", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Maximum Aperture", + "value": "T2.1" + }, + { + "group": "Key Specs", + "label": "Minimum Aperture", + "value": "T22" + }, + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "ARRI PL with Included Adapter" + }, + { + "group": "Key Specs", + "label": "Lens Format Coverage", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Focus Scales", + "value": "Imperial" + }, + { + "group": "Key Specs", + "label": "Optical Design", + "value": "9 Elements in 7 Groups" + }, + { + "group": "Key Specs", + "label": "Filter Thread", + "value": "77 mm" + }, + { + "group": "Key Specs", + "label": "Minimum Focus Distance", + "value": "From Camera Sensor: 27.6\" / 70 cm" + }, + { + "group": "Key Specs", + "label": "Aperture/Iris Blades", + "value": "16" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Lens Mounting", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Gear Standard", + "value": "0.8 MOD" + }, + { + "group": "Key Specs", + "label": "Gear Rotation", + "value": "Focus: 270° | Iris: 83°" + }, + { + "group": "Key Specs", + "label": "Electronic Communication", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Diameter", + "value": "Front: 3.1\" / 80 mm" + }, + { + "group": "Key Specs", + "label": "Length", + "value": "3.9\" / 100 mm" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "31.4 oz / 890 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.81 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "8.6 x 5.2 x 4.9\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1601847-REG/dzofilm_vespid_100mm_t2_1_lens.html", + "archive_url": "https://web.archive.org/web/20260109005323/https://www.bhphotovideo.com/c/product/1601847-REG/dzofilm_vespid_100mm_t2_1_lens.html", + "archive_timestamp": "20260109005323", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "dzofilm-vespid-125mm-t2-1-lens-pl-ef-mounts", + "name": "DZOFilm VESPID 125mm T2.1 Lens (PL & EF Mounts)", + "brand": "DZOFilm", + "bh_sku": "DZ125VPL", + "mpn": "DZO-V12521PL", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 799.0, + "availability": "In Stock", + "condition": "New", + "description": "Relatively small and lightweight, the DZOFilm VESPID 125mm T2.1 Lens is part of the VESPID series of lenses from DZOFilm and is well suited for independent and high-end full-frame cinematography. The lens has an 80mm front diameter, allowing it to work with virtually any cine-style matte box. The small size makes this lens an attractive option when working with drones and gimbals, as well as when shooting handheld or run-and-gun. The interchangeable PL mount and included EF mount allow you to use the fully manual lens on a variety of modern and vintage cine cameras, while the full-frame coverage supports sensors that have an image circle up to 46.5mm for use on cameras with sensors up to full-frame without vignetting..", + "mount_type": "ARRI PL with Included Canon EF Adapter", + "sensor_size": null, + "focal_length": "125mm", + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/dz125vpl.jpg", + "image_sha256": "9a10b1a62a3cba03fef4a392326b18677309d9db85e3521c096d58f23937218e", + "specs": [ + { + "group": "Key Specs", + "label": "Focal Length", + "value": "125mm" + }, + { + "group": "Key Specs", + "label": "Maximum Aperture", + "value": "T2.1" + }, + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "ARRI PL with Included Canon EF Adapter" + }, + { + "group": "Key Specs", + "label": "Lens Format Coverage", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Filter Thread", + "value": "77 mm" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Electronic Communication", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Maximum Aperture", + "value": "T2.1" + }, + { + "group": "Key Specs", + "label": "Minimum Aperture", + "value": "T22" + }, + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "ARRI PL with Included Canon EF Adapter" + }, + { + "group": "Key Specs", + "label": "Lens Format Coverage", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Focus Scales", + "value": "Imperial" + }, + { + "group": "Key Specs", + "label": "Optical Design", + "value": "10 Elements in 8 Groups" + }, + { + "group": "Key Specs", + "label": "Filter Thread", + "value": "77 mm" + }, + { + "group": "Key Specs", + "label": "Minimum Focus Distance", + "value": "From Camera Sensor: 31\" / 78.7 cm" + }, + { + "group": "Key Specs", + "label": "Aperture/Iris Blades", + "value": "16" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Lens Mounting", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Gear Standard", + "value": "0.8 MOD" + }, + { + "group": "Key Specs", + "label": "Gear Rotation", + "value": "Focus: 270° | Iris: 84°" + }, + { + "group": "Key Specs", + "label": "Electronic Communication", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Diameter", + "value": "Front: 3.1\" / 80 mm" + }, + { + "group": "Key Specs", + "label": "Length", + "value": "3.9\" / 100 mm" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "32.6 oz / 924 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.89 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "8.7 x 5.3 x 5\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1601848-REG/dzofilm_vespid_125mm_t2_1_lens.html", + "archive_url": "https://web.archive.org/web/20260110095944/https://www.bhphotovideo.com/c/product/1601848-REG/dzofilm_vespid_125mm_t2_1_lens.html", + "archive_timestamp": "20260110095944", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "dzofilm-vespid-25mm-t2-1-lens-pl-ef-mounts", + "name": "DZOFilm VESPID 25mm T2.1 Lens (PL & EF Mounts)", + "brand": "DZOFilm", + "bh_sku": "DZ25VPL", + "mpn": "DZO-V02521PL", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 799.0, + "availability": "In Stock", + "condition": "New", + "description": "Relatively small and lightweight, the DZOFilm VESPID 25mm T2.1 Lens is part of the VESPID series of lenses from DZOFilm and is well suited for independent and high-end full-frame cinematography. The lens has an 80mm front diameter, allowing it to work with virtually any cine-style matte box. The small size makes this lens an attractive option when working with drones and gimbals, as well as when shooting handheld or run-and-gun. The interchangeable PL mount and included EF mount allow you to use the fully manual lens on a variety of modern and vintage cine cameras, while the full-frame coverage supports sensors that have an image circle up to 46.5mm for use on cameras with sensors up to full-frame without vignetting..", + "mount_type": "ARRI PL", + "sensor_size": null, + "focal_length": "25mm", + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Focal Length", + "value": "25mm" + }, + { + "group": "Key Specs", + "label": "Maximum Aperture", + "value": "T2.1" + }, + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "ARRI PL" + }, + { + "group": "Key Specs", + "label": "Lens Format Coverage", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Filter Thread", + "value": "77 mm" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Electronic Communication", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Maximum Aperture", + "value": "T2.1" + }, + { + "group": "Key Specs", + "label": "Minimum Aperture", + "value": "T22" + }, + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "ARRI PL" + }, + { + "group": "Key Specs", + "label": "Interchangeable Mount", + "value": "Yes" + }, + { + "group": "Key Specs", + "label": "Lens Format Coverage", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Image Circle", + "value": "46.5 mm" + }, + { + "group": "Key Specs", + "label": "Focus Scales", + "value": "Metric, Imperial" + }, + { + "group": "Key Specs", + "label": "Filter Thread", + "value": "77 mm" + }, + { + "group": "Key Specs", + "label": "Aperture/Iris Blades", + "value": "16" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Gear Standard", + "value": "Focus, Iris: 0.8 MOD" + }, + { + "group": "Key Specs", + "label": "Gear Rotation", + "value": "Focus: 270° | Iris: 64°" + }, + { + "group": "Key Specs", + "label": "Electronic Communication", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Diameter", + "value": "Front: 3.1\" / 80 mm" + }, + { + "group": "Key Specs", + "label": "Length", + "value": "3.9\" / 100 mm" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "33.2 oz / 940 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.915 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "8.6 x 5.3 x 5\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1601842-REG/dzofilm_vespid_25mm_t2_1_lens.html", + "archive_url": "https://web.archive.org/web/20251013081641/https://www.bhphotovideo.com/c/product/1601842-REG/dzofilm_vespid_25mm_t2_1_lens.html", + "archive_timestamp": "20251013081641", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "irix-45mm-t1-5-cine-lens-leica-l-feet-black", + "name": "IRIX 45mm T1.5 Cine Lens (Leica L, Feet, Black)", + "brand": "IRIX", + "bh_sku": "IRILC45LI", + "mpn": "IL-C45-L-I", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 1195.0, + "availability": "In Stock", + "condition": "New", + "description": "Designed for cine-style image capture and covering up to full-frame size sensors, the black Leica L-mount 45mm T1.5 Cine Lens from IRIX incorporates multiple internal and external design features. External features include a 95mm front diameter, 0.8 MOD gears, luminous focus marks in feet, and a detachable 1/4\"-20 support foot. Internally, nine blades produce smooth, rounded bokeh, and five seals protect against inclement weather and dust.", + "mount_type": "L-Mount", + "sensor_size": null, + "focal_length": "45mm", + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Focal Length", + "value": "45mm" + }, + { + "group": "Key Specs", + "label": "Maximum Aperture", + "value": "T1.5" + }, + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "L-Mount" + }, + { + "group": "Key Specs", + "label": "Lens Format Coverage", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Filter Thread", + "value": "86 mm" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Electronic Communication", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Maximum Aperture", + "value": "T1.5" + }, + { + "group": "Key Specs", + "label": "Minimum Aperture", + "value": "T22" + }, + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "L-Mount" + }, + { + "group": "Key Specs", + "label": "Interchangeable Mount", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Lens Format Coverage", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Image Circle", + "value": "43.3 mm" + }, + { + "group": "Key Specs", + "label": "Angle of View", + "value": "Full Frame | Horizontal: 43.6° | Super 35 | Horizontal: 30.9° | APS-C (1.5x) | Horizontal: 29.4° | APS-C (1.6x) | Horizontal: 27.7° | MFT | Horizontal: 21.8°" + }, + { + "group": "Key Specs", + "label": "Focus Scales", + "value": "Imperial" + }, + { + "group": "Key Specs", + "label": "Optical Design", + "value": "11 Elements in 9 Groups" + }, + { + "group": "Key Specs", + "label": "Filter Thread", + "value": "86 mm" + }, + { + "group": "Key Specs", + "label": "Minimum Focus Distance", + "value": "From Camera Sensor: 1.15' / 0.35 m" + }, + { + "group": "Key Specs", + "label": "Aperture/Iris Blades", + "value": "9" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Lens Mounting", + "value": "1x 1/4\"-20 (via Included Support Foot)" + }, + { + "group": "Key Specs", + "label": "Gear Standard", + "value": "0.8 MOD" + }, + { + "group": "Key Specs", + "label": "Gear Rotation", + "value": "Focus: 180° | Iris: 75°" + }, + { + "group": "Key Specs", + "label": "Electronic Communication", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Diameter", + "value": "Front: 3.7\" / 95 mm" + }, + { + "group": "Key Specs", + "label": "Length", + "value": "5.4\" / 136 mm" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "2.65 lb / 1.2 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "3.805 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "9.7 x 5.6 x 5.2\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1602120-REG/irix_il_c45_l_i_45mm_t1_5_cine_lens.html", + "archive_url": "https://web.archive.org/web/20250808105630/https://www.bhphotovideo.com/c/product/1602120-REG/irix_il_c45_l_i_45mm_t1_5_cine_lens.html", + "archive_timestamp": "20250808105630", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "k-f-concept-nano-x-series-variable-nd-cpl-2-in-1-filter-67mm-1-to-5-stop", + "name": "K&F Concept Nano-X Series Variable ND & CPL 2-in-1 Filter (67mm, 1 to 5-Stop)", + "brand": "K&F Concept", + "bh_sku": "KF011085", + "mpn": "KF01.1085", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 75.67, + "availability": "In Stock", + "condition": "New", + "description": "This 67mm 2-in-1 Filter from K&F Concept combines a 1 to 5-stop variable ND filter and a circular polarizer in a single design. It can be used to lower the exposure of your image and reduce reflections at the same time. Crafted with optical glass and featuring waterproof and scratch-resistant multicoating, this filter allows only 0.7% light transmission. The filter frame is made of aluminum and rotates between five ND designations.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Specifications", + "label": "Filter Type", + "value": "Variable ND with Circular Polarizer" + }, + { + "group": "Specifications", + "label": "Exposure Reduction", + "value": "1 to 5-Stop" + }, + { + "group": "Specifications", + "label": "Size", + "value": "67 mm Rear Filter Thread" + }, + { + "group": "Specifications", + "label": "Front Accessory Thread / Bayonet", + "value": "77 mm" + }, + { + "group": "Specifications", + "label": "Coating", + "value": "Multi- & Resistance-Coated" + }, + { + "group": "Specifications", + "label": "Filter Thickness", + "value": "0.4\" / 9.3 mm" + }, + { + "group": "Specifications", + "label": "Filter Material", + "value": "Glass" + }, + { + "group": "Specifications", + "label": "Ring Material", + "value": "Aluminum" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.26 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "4.45 x 4.45 x 0.85\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1801869-REG/k_f_concept_kf01_1085_67mm_nano_d_series_lens.html", + "archive_url": "https://web.archive.org/web/20251015150925/https://www.bhphotovideo.com/c/product/1801869-REG/k_f_concept_kf01_1085_67mm_nano_d_series_lens.html", + "archive_timestamp": "20251015150925", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "k-f-concept-nano-x-series-variable-nd-cpl-2-in-1-filter-72mm-1-to-5-stop", + "name": "K&F Concept Nano-X Series Variable ND & CPL 2-in-1 Filter (72mm, 1 to 5-Stop)", + "brand": "K&F Concept", + "bh_sku": "KF011086", + "mpn": "KF01.1086", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 75.0, + "availability": "In Stock", + "condition": "New", + "description": "This 72mm 2-in-1 Filter from K&F Concept combines a 1 to 5-stop variable ND filter and a circular polarizer in a single design. It can be used to lower the exposure of your image and reduce reflections at the same time. Crafted with optical glass and featuring waterproof and scratch-resistant multicoating, this filter allows only 0.7% light transmission. The filter frame is made of aluminum and rotates between five ND designations.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Specifications", + "label": "Filter Type", + "value": "Variable ND with Circular Polarizer" + }, + { + "group": "Specifications", + "label": "Exposure Reduction", + "value": "1 to 5-Stop" + }, + { + "group": "Specifications", + "label": "Size", + "value": "72 mm Rear Filter Thread" + }, + { + "group": "Specifications", + "label": "Front Accessory Thread / Bayonet", + "value": "77 mm" + }, + { + "group": "Specifications", + "label": "Coating", + "value": "Multi- & Resistance-Coated" + }, + { + "group": "Specifications", + "label": "Filter Thickness", + "value": "0.4\" / 9.3 mm" + }, + { + "group": "Specifications", + "label": "Filter Material", + "value": "Glass" + }, + { + "group": "Specifications", + "label": "Ring Material", + "value": "Aluminum" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.27 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "4.5 x 4.45 x 0.85\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1801870-REG/k_f_concept_kf01_1086_72mm_nano_d_series_lens.html", + "archive_url": "https://web.archive.org/web/20250711080513/https://www.bhphotovideo.com/c/product/1801870-REG/k_f_concept_kf01_1086_72mm_nano_d_series_lens.html", + "archive_timestamp": "20250711080513", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "k-f-concept-nano-x-series-variable-nd-cpl-2-in-1-filter-77mm-1-to-5-stop", + "name": "K&F Concept Nano-X Series Variable ND & CPL 2-in-1 Filter (77mm, 1 to 5-Stop)", + "brand": "K&F Concept", + "bh_sku": "KF011087", + "mpn": "KF01.1087", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 80.98, + "availability": "In Stock", + "condition": "New", + "description": "This 77mm 2-in-1 Filter from K&F Concept combines a 1 to 5-stop variable ND filter and a circular polarizer in a single design. It can be used to lower the exposure of your image and reduce reflections at the same time. Crafted with optical glass and featuring waterproof and scratch-resistant multicoating, this filter allows only 0.7% light transmission. The filter frame is made of aluminum and rotates between five ND designations.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Specifications", + "label": "Filter Type", + "value": "Variable ND with Circular Polarizer" + }, + { + "group": "Specifications", + "label": "Exposure Reduction", + "value": "1 to 5-Stop" + }, + { + "group": "Specifications", + "label": "Size", + "value": "77 mm Rear Filter Thread" + }, + { + "group": "Specifications", + "label": "Front Accessory Thread / Bayonet", + "value": "82 mm" + }, + { + "group": "Specifications", + "label": "Coating", + "value": "Multi- & Resistance-Coated" + }, + { + "group": "Specifications", + "label": "Filter Thickness", + "value": "0.4\" / 9.3 mm" + }, + { + "group": "Specifications", + "label": "Filter Material", + "value": "Glass" + }, + { + "group": "Specifications", + "label": "Ring Material", + "value": "Aluminum" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.285 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "5.1 x 4.8 x 0.7\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1801871-REG/k_f_concept_kf01_1087_77mm_nano_d_series_lens.html", + "archive_url": "https://web.archive.org/web/20250621074458/https://www.bhphotovideo.com/c/product/1801871-REG/k_f_concept_kf01_1087_77mm_nano_d_series_lens.html", + "archive_timestamp": "20250621074458", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "ttartisan-af-23mm-f-1-8-lens-sony-e", + "name": "TTArtisan AF 23mm f/1.8 Lens (Sony E)", + "brand": "TTArtisan", + "bh_sku": "TTAF2318EB", + "mpn": "AF2318-E-B", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 101.6, + "availability": "In Stock", + "condition": "New", + "description": "A lightweight, high-performance APS-C prime lens, the TTArtisan AF 23mm f/1.8 Lens for Sony E-mount cameras introduces STM-driven autofocus into a fast, sleek design. Ideal for capturing street scenes, landscapes, portraits, and more, the lens delivers sharp and clear imagery with a natural perspective and a 35mm full-frame equivalent focal length. Its durable, aviation-grade aluminum body weighs just 7.8 oz, ideal for all-day use. Its fast f/1.8 aperture benefits low-light performance and shallow depth-of-field effects like bokeh and subject isolation. Additionally, a minimum focusing distance of 11.8\" enables detailed close-ups for photographing food, crafts, and everyday objects.", + "mount_type": "Sony E", + "sensor_size": null, + "focal_length": "23mm (35mm Equivalent: 35mm)", + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/ttaf2318eb.jpg", + "image_sha256": "6f61bc5a160afe23d56169f0994ef670024ee8d3bb6df6f22167fd56982d8157", + "specs": [ + { + "group": "Specifications", + "label": "Focal Length", + "value": "23mm (35mm Equivalent: 35mm)" + }, + { + "group": "Specifications", + "label": "Aperture", + "value": "Maximum: f/1.8 | Minimum: f/16" + }, + { + "group": "Specifications", + "label": "Lens Mount", + "value": "Sony E" + }, + { + "group": "Specifications", + "label": "Lens Format Coverage", + "value": "APS-C" + }, + { + "group": "Specifications", + "label": "Angle of View", + "value": "62°" + }, + { + "group": "Specifications", + "label": "Minimum Focus Distance", + "value": "11.8\" / 0.3 m" + }, + { + "group": "Specifications", + "label": "Optical Design", + "value": "11 Elements in 9 Groups" + }, + { + "group": "Specifications", + "label": "Aperture/Iris Blades", + "value": "9" + }, + { + "group": "Specifications", + "label": "Focus Type", + "value": "Autofocus" + }, + { + "group": "Specifications", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Specifications", + "label": "Filter Size", + "value": "52 mm (Front)" + }, + { + "group": "Specifications", + "label": "Dimensions", + "value": "ø: 2.6 x L: 2.4\" / ø: 6.7 x L: 6 cm" + }, + { + "group": "Specifications", + "label": "Weight", + "value": "7.4 oz / 210 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.885 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "5.5 x 4.1 x 3.9\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1908688-REG/ttartisan_af2318_e_b_af_23mm_f_1_8_lens.html", + "archive_url": "https://web.archive.org/web/20251201225037/https://www.bhphotovideo.com/c/product/1908688-REG/ttartisan_af2318_e_b_af_23mm_f_1_8_lens.html", + "archive_timestamp": "20251201225037", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "ttartisan-af-40mm-f-2-lens-sony-e", + "name": "TTArtisan AF 40mm f/2 Lens (Sony E)", + "brand": "TTArtisan", + "bh_sku": "TT40AE", + "mpn": "F4020-E-B", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 134.4, + "availability": "In Stock", + "condition": "New", + "description": "Notably portable with a focal length made for everyday shooting, the AF 40mm f/2 Lens from TTArtisan is a versatile prime designed for Sony E-mount mirrorless cameras. With its fast f/2 maximum aperture, this lens performs well in low light and separates subjects from their backgrounds effectively while creating flattering bokeh around them. The AF 40mm f/2 features durable all-metal construction and has a USB port on its lens cap for making convenient firmware upgrades. Its small and lightweight form factor renders this lens as an optimal choice for street, travel, and documentary photography.", + "mount_type": "Sony E", + "sensor_size": null, + "focal_length": "40mm", + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Specifications", + "label": "Focal Length", + "value": "40mm" + }, + { + "group": "Specifications", + "label": "Aperture", + "value": "Maximum: f/2 | Minimum: f/16" + }, + { + "group": "Specifications", + "label": "Lens Mount", + "value": "Sony E" + }, + { + "group": "Specifications", + "label": "Lens Format Coverage", + "value": "Full-Frame" + }, + { + "group": "Specifications", + "label": "Angle of View", + "value": "57°" + }, + { + "group": "Specifications", + "label": "Minimum Focus Distance", + "value": "15.7\" / 40 cm" + }, + { + "group": "Specifications", + "label": "Optical Design", + "value": "9 Elements in 6 Groups" + }, + { + "group": "Specifications", + "label": "Aperture/Iris Blades", + "value": "7" + }, + { + "group": "Specifications", + "label": "Focus Type", + "value": "Autofocus" + }, + { + "group": "Specifications", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Specifications", + "label": "Filter Size", + "value": "52 mm (Front)" + }, + { + "group": "Specifications", + "label": "Dimensions", + "value": "ø: 2.4 x L: 1.7\" / ø: 61 x L: 44 mm" + }, + { + "group": "Specifications", + "label": "Weight", + "value": "6.2 oz / 176 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.72 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "4.25 x 4 x 3.5\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1911402-REG/ttartisan_f4020_e_b_af_40mm_f_2_lens.html", + "archive_url": "https://web.archive.org/web/20251126173207/https://www.bhphotovideo.com/c/product/1911402-REG/ttartisan_f4020_e_b_af_40mm_f_2_lens.html", + "archive_timestamp": "20251126173207", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "ttartisan-af-75mm-f-2-lens-fujifilm-x-black", + "name": "TTArtisan AF 75mm f/2 Lens (FUJIFILM X, Black)", + "brand": "TTArtisan", + "bh_sku": "TTAF7520XB", + "mpn": "AF7520-X-B", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 199.0, + "availability": "In Stock", + "condition": "New", + "description": "The TTArtisan AF 75mm f/2 Lens is a fast, portable, and autofocus-enabled prime lens ideal for portraiture. Lightweight at 12 oz, the lens's bright f/2 aperture is effective at separating subjects from the background with a pleasing bokeh. The lens can focus on subjects as close as 2.5', while its optical design features an extra-low dispersion element and four high-index elements to increase sharpness and reduce chromatic aberrations.", + "mount_type": "FUJIFILM X", + "sensor_size": null, + "focal_length": "75mm", + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/ttaf7520xb.jpg", + "image_sha256": "7566e4766f78a26a4a5851dc6e9287a7f7c1ec2a77c27ed45b33e617b2811810", + "specs": [ + { + "group": "Specifications", + "label": "Focal Length", + "value": "75mm" + }, + { + "group": "Specifications", + "label": "Aperture", + "value": "Maximum: f/2 | Minimum: f/16" + }, + { + "group": "Specifications", + "label": "Lens Mount", + "value": "FUJIFILM X" + }, + { + "group": "Specifications", + "label": "Lens Format Coverage", + "value": "Full-Frame" + }, + { + "group": "Specifications", + "label": "Angle of View", + "value": "32°" + }, + { + "group": "Specifications", + "label": "Minimum Focus Distance", + "value": "2.5' / 75 cm" + }, + { + "group": "Specifications", + "label": "Optical Design", + "value": "10 Elements in 7 Groups" + }, + { + "group": "Specifications", + "label": "Aperture/Iris Blades", + "value": "9" + }, + { + "group": "Specifications", + "label": "Focus Type", + "value": "Autofocus" + }, + { + "group": "Specifications", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Specifications", + "label": "Filter Size", + "value": "62 mm (Front)" + }, + { + "group": "Specifications", + "label": "Dimensions", + "value": "2.6 x 2.9\" / 67 x 74 mm (Diameter x Length)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.14 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "5.2 x 4.2 x 3.5\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1914621-REG/ttartisan_af7520_x_b_af_75mm_f_2_lens.html", + "archive_url": "https://web.archive.org/web/20260812230048/https://www.bhphotovideo.com/c/product/1914621-REG/ttartisan_af7520_x_b_af_75mm_f_2_lens.html", + "archive_timestamp": "20260812230048", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "tokina-cinema-vista-p-25mm-t1-5-prime-lens-arri-pl-feet", + "name": "Tokina Cinema Vista-P 25mm T1.5 Prime Lens (ARRI PL, Feet)", + "brand": "Tokina", + "bh_sku": "TOKPC3105PL", + "mpn": "KPC-3105PL", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 7499.0, + "availability": "In Stock", + "condition": "New", + "description": "The ARRI PL mount Tokina Cinema Vista-P 25mm T1.5 Prime Lens provides a lower-contrast look with strong spherical distortion that creates a Petzval-type effect with swirly bokeh. Its large image circle more than covers full-frame digital and film sensors and is designed for up to 8K capture. It features a fast T1.5 maximum T-stop for shooting in low-light settings or for creating shallow depth of field looks. Each Vista-P prime lens is designed to minimize focus breathing and incorporates 0.8 MOD geared manual focus and iris rings. Markings on both sides of the lens barrel make it readable from either side of the camera.", + "mount_type": "ARRI PL", + "sensor_size": null, + "focal_length": "25mm", + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Focal Length", + "value": "25mm" + }, + { + "group": "Key Specs", + "label": "Maximum Aperture", + "value": "T1.5" + }, + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "ARRI PL" + }, + { + "group": "Key Specs", + "label": "Lens Format Coverage", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Filter Thread", + "value": "112 mm" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Electronic Communication", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Maximum Aperture", + "value": "T1.5" + }, + { + "group": "Key Specs", + "label": "Minimum Aperture", + "value": "T22" + }, + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "ARRI PL" + }, + { + "group": "Key Specs", + "label": "Interchangeable Mount", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Lens Format Coverage", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Image Circle", + "value": "46.7 mm" + }, + { + "group": "Key Specs", + "label": "Angle of View", + "value": "Not Specified by Manufacturer" + }, + { + "group": "Key Specs", + "label": "Focus Scales", + "value": "Imperial" + }, + { + "group": "Key Specs", + "label": "Optical Design", + "value": "16 Elements in 15 Groups" + }, + { + "group": "Key Specs", + "label": "Filter Thread", + "value": "112 mm" + }, + { + "group": "Key Specs", + "label": "Minimum Focus Distance", + "value": "13.8\" / 35 cm" + }, + { + "group": "Key Specs", + "label": "Magnification", + "value": "1:7.8 Macro Reproduction Ratio | 0.12x Magnification" + }, + { + "group": "Key Specs", + "label": "Aperture/Iris Blades", + "value": "9" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Lens Mounting", + "value": "1x 1/4\"-20" + }, + { + "group": "Key Specs", + "label": "Gear Rotation", + "value": "Focus: 300°" + }, + { + "group": "Key Specs", + "label": "Electronic Communication", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Diameter", + "value": "4.5\" / 114 mm" + }, + { + "group": "Key Specs", + "label": "Length", + "value": "Not Specified by Manufacturer" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "5.11 lb / 2.32 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "6.13 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "9.3 x 9.1 x 7.7\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1800768-REG/tokina_kpc_3105pl_vista_p_25mm_t1_5_lens.html", + "archive_url": "https://web.archive.org/web/20250913004229/https://www.bhphotovideo.com/c/product/1800768-REG/tokina_kpc_3105pl_vista_p_25mm_t1_5_lens.html", + "archive_timestamp": "20250913004229", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "viltrox-af-33mm-f-1-4-e-lens-for-sony-e-black", + "name": "Viltrox AF 33mm f/1.4 E Lens for Sony E (Black)", + "brand": "Viltrox", + "bh_sku": "VIAF3314E", + "mpn": "AF 33/1.4 E", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 239.0, + "availability": "In Stock", + "condition": "New", + "description": "Compact and comfortable, the AF 33mm f/1.4 E from Viltrox is a normal-length prime lens designed for Sony E-mount mirrorless cameras. The versatile normal field of view is suitable for a wide range of subjects, from portraiture to reportage, and the fast f/1.4 design excels in low-light conditions and for shallow depth of field applications. The optical design incorporates extra-low dispersion and high refractive index elements to suppress a variety of aberrations and distortion and an HD Nano multi-layer coating has also been applied to reduce flare and ghosting for greater contrast in bright and backlit conditions.", + "mount_type": "Sony E", + "sensor_size": null, + "focal_length": "33mm (35mm Equivalent: 50mm)", + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/viaf3314e.jpg", + "image_sha256": "4d25aaba9b3b3e6f925980853a1915cfcbaedd2a080c6175edb8cef3f7cc1d40", + "specs": [ + { + "group": "Specifications", + "label": "Focal Length", + "value": "33mm (35mm Equivalent: 50mm)" + }, + { + "group": "Specifications", + "label": "Aperture", + "value": "Maximum: f/1.4 | Minimum: f/16" + }, + { + "group": "Specifications", + "label": "Lens Mount", + "value": "Sony E" + }, + { + "group": "Specifications", + "label": "Lens Format Coverage", + "value": "APS-C" + }, + { + "group": "Specifications", + "label": "Angle of View", + "value": "45.2°" + }, + { + "group": "Specifications", + "label": "Minimum Focus Distance", + "value": "1.31' / 40 cm" + }, + { + "group": "Specifications", + "label": "Magnification", + "value": "1:10 Macro Reproduction Ratio | 0.1x Magnification" + }, + { + "group": "Specifications", + "label": "Optical Design", + "value": "10 Elements in 9 Groups" + }, + { + "group": "Specifications", + "label": "Aperture/Iris Blades", + "value": "9" + }, + { + "group": "Specifications", + "label": "Focus Type", + "value": "Autofocus" + }, + { + "group": "Specifications", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Specifications", + "label": "Filter Size", + "value": "52 mm (Front)" + }, + { + "group": "Specifications", + "label": "Dimensions", + "value": "ø: 2.6 x L: 2.8\" / ø: 65 x L: 72 mm" + }, + { + "group": "Specifications", + "label": "Weight", + "value": "9.52 oz / 270 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.17 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "4.6 x 3.8 x 3.8\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1607408-REG/viltrox_af_33_1_4_e_33mm_f_1_4_lens_for.html", + "archive_url": "https://web.archive.org/web/20251206173119/https://www.bhphotovideo.com/c/product/1607408-REG/viltrox_af_33_1_4_e_33mm_f_1_4_lens_for.html", + "archive_timestamp": "20251206173119", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "viltrox-af-35mm-f-1-2-lab-z-lens-nikon-z", + "name": "Viltrox AF 35mm f/1.2 LAB Z Lens (Nikon Z)", + "brand": "Viltrox", + "bh_sku": "VIAF3512Z", + "mpn": "AF 35/1.2 Z", + "department_slug": "photography", + "subcategory_slug": "camera-lenses", + "product_type": "Lens", + "price_usd": 999.0, + "availability": "In Stock", + "condition": "New", + "description": "An ultrabright wide-angle prime perfect for everyday photography, the AF 35mm f/1.2 LAB Z Lens from Viltrox for Nikon Z-mount full-frame digital camera couples a high-quality optical design with an intuitively crafted lens barrel that allows swift setting adjustments while capturing. Quick and quiet autofocus performance is provided via its VCM focusing motor. Its f/1.2 maximum aperture allows working in dimly lit environments and helps create stunning bokeh. Optical aberration and image distortion are reduced by the incorporated extra-low dispersion (ED), high-refractive (HR), and aspherical (ASPH) lens elements. Featured on the barrel are two Fn buttons, ensuring your favorite custom settings are easily accessible. Additionally, the lens is protected by a multilayer nanocoating that prevents water, dust, and fouling damage.", + "mount_type": "Nikon Z", + "sensor_size": null, + "focal_length": "35mm", + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/viaf3512z.jpg", + "image_sha256": "13fe41e180d1b0e8d2f51f49503266125419dcc8ea2e92737fbb8da129070e7b", + "specs": [ + { + "group": "Specifications", + "label": "Focal Length", + "value": "35mm" + }, + { + "group": "Specifications", + "label": "Aperture", + "value": "Maximum: f/1.2 | Minimum: f/16" + }, + { + "group": "Specifications", + "label": "Lens Mount", + "value": "Nikon Z" + }, + { + "group": "Specifications", + "label": "Lens Format Coverage", + "value": "Full-Frame" + }, + { + "group": "Specifications", + "label": "Angle of View", + "value": "64.2°" + }, + { + "group": "Specifications", + "label": "Minimum Focus Distance", + "value": "From Camera Sensor: 13.4\" / 34 cm" + }, + { + "group": "Specifications", + "label": "Magnification", + "value": "1:5.88 Macro Reproduction Ratio | 0.17x Magnification" + }, + { + "group": "Specifications", + "label": "Optical Design", + "value": "15 Elements in 10 Groups" + }, + { + "group": "Specifications", + "label": "Aperture/Iris Blades", + "value": "11" + }, + { + "group": "Specifications", + "label": "Focus Type", + "value": "Autofocus" + }, + { + "group": "Specifications", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Specifications", + "label": "Filter Size", + "value": "77 mm (Front)" + }, + { + "group": "Specifications", + "label": "Dimensions", + "value": "ø: 3.5 x L: 4.9\" / ø: 89.2 x L: 123.5 mm" + }, + { + "group": "Specifications", + "label": "Weight", + "value": "2.1 lb / 970 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "4.2 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "10.7 x 7 x 6.3\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1933792-REG/viltrox_af_35_1_2_z_af_35mm_f_1_2_lens.html", + "archive_url": "https://web.archive.org/web/20260207232127/https://www.bhphotovideo.com/c/product/1933792-REG/viltrox_af_35_1_2_z_af_35mm_f_1_2_lens.html", + "archive_timestamp": "20260207232127", + "fetched_at": "2026-09-12T17:27:30Z" + } + }, + { + "slug": "canon-eos-90d-dslr-camera-body-only", + "name": "Canon EOS 90D DSLR Camera (Body Only)", + "brand": "Canon", + "bh_sku": "CAE90D", + "mpn": "3616C002", + "department_slug": "photography", + "subcategory_slug": "dslr-cameras", + "product_type": "DSLR Camera", + "price_usd": 1199.0, + "availability": "In Stock", + "condition": "New", + "description": "Situated as a versatile camera with capable photo and video traits, the Canon EOS 90D is a sleek DSLR also characterized by its high-resolution 32.5MP APS-C CMOS sensor. This updated sensor design achieves enhanced image clarity, resolution, and dynamic range, along with adept sensitivity to ISO 25600 and low noise to suit working in a variety of situations. Combined with advanced image processing, this sensor is also capable of outputting UHD 4K30p and Full HD 120p video, as well as supporting continuous stills shooting rates up to 10 fps. When working with the optical viewfinder, an apt 45-point all cross-type AF system affords fast performance in a range of lighting conditions for tracking moving subjects and working in low light, while the 5481-point Dual Pixel CMOS AF system benefits live-view shooting and movie recording by providing a smooth, natural focusing quality akin to the way a camcorder acquires focus. Complementing the imaging capabilities, the 90D sports a vari-angle touchscreen LCD for intuitive control and compositional freedom, and an optical pentaprism viewfinder provides a bright, clear, and realistic viewing means characteristic of the DSLR shooting experienc", + "mount_type": "Canon EF-S", + "sensor_size": "22.3 x 14.8 mm (APS-C) CMOS", + "focal_length": null, + "connectivity": "Wi-Fi 4 (802.11n), Bluetooth 4.1", + "megapixels": 32.5, + "capacity_gb": null, + "image_path": "images/products/cae90d.jpg", + "image_sha256": "e87d7ecddae1c016097319a6f924d9b3787505fe75d23e603fc126935d29915d", + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Canon EF-S" + }, + { + "group": "Key Specs", + "label": "Sensor Resolution", + "value": "Actual: 34.4 Megapixel | Effective: 32.5 Megapixel (6960 x 4640)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "22.3 x 14.8 mm (APS-C) CMOS" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Digital (Video Only)" + }, + { + "group": "Key Specs", + "label": "ISO Sensitivity Range", + "value": "Photo | 100 to 25,600 in Manual, Auto Mode (Extended: 51,200) | Video | 100 to 12,800 in Manual, Auto Mode (Extended: 25,600)" + }, + { + "group": "Key Specs", + "label": "Internal Recording Modes", + "value": "H.264/MP4 | UHD 4K (3840 x 2160) at 23.98/25/29.97 fps [120 Mb/s VBR] | 1920 x 1080p at 23.98/25/29.97/50/59.94/100/120 fps [12 to 120 Mb/s VBR] | 1280 x 720 at 50/59.94 fps [26 Mb/s VBR]" + }, + { + "group": "Key Specs", + "label": "External Recording Modes", + "value": "4:2:2 8-Bit via HDMI | UHD 4K (3840 x 2160) at 25/29.97 fps | 1920 x 1080p" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-II)" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Mini-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x Canon E3 (2.5 mm Sub-Mini) Remote Input | 1x Micro-USB (USB 2.0) Data Output" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Wi-Fi 4 (802.11n), Bluetooth 4.1" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Articulating Touchscreen LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x LP-E6N Rechargeable Lithium-Ion, 7.2 VDC, 1865 mAh (Included) |  • Approx. 1300 Shots" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Canon EF-S" + }, + { + "group": "Imaging", + "label": "Sensor Resolution", + "value": "Actual: 34.4 Megapixel | Effective: 32.5 Megapixel (6960 x 4640)" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "22.3 x 14.8 mm (APS-C) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1.6x | *Additional Crop Occurs in Select Video Modes" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Digital (Video Only)" + }, + { + "group": "Imaging", + "label": "Mirror Lock-Up", + "value": "Yes" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Mechanical Focal Plane Shutter and Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Shutter | 1/16000 to 30 Seconds | Mechanical Shutter | 1/8000 to 30 Seconds" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb Mode" + }, + { + "group": "Exposure Control", + "label": "ISO Sensitivity Range", + "value": "Photo | 100 to 25,600 in Manual, Auto Mode (Extended: 51,200) | Video | 100 to 12,800 in Manual, Auto Mode (Extended: 25,600)" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Evaluative, Partial, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-5 to +5 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "1 to 20 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "2500 to 10,000K | Presets: Auto, Cloudy, Color Temperature, Custom, Daylight, Flash, Fluorescent (White), Shade, Tungsten" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 10 fps at Maximum Resolution for up to 25 Frames (Raw) / 58 Frames (JPEG)" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/10-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 3:2, 4:3, 16:9" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "JPEG, Raw" + }, + { + "group": "Still Image Capture", + "label": "Bit Depth", + "value": "14-Bit" + }, + { + "group": "Video Capture", + "label": "Internal Recording Modes", + "value": "H.264/MP4 | UHD 4K (3840 x 2160) at 23.98/25/29.97 fps [120 Mb/s VBR] | 1920 x 1080p at 23.98/25/29.97/50/59.94/100/120 fps [12 to 120 Mb/s VBR] | 1280 x 720 at 50/59.94 fps [26 Mb/s VBR]" + }, + { + "group": "Video Capture", + "label": "External Recording Modes", + "value": "4:2:2 8-Bit via HDMI | UHD 4K (3840 x 2160) at 25/29.97 fps | 1920 x 1080p" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "30-Minute Maximum | 8-Minute Maximum in 1080p HFR" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "AAC Audio | LPCM Audio" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-II)" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Mini-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "No" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x Canon E3 (2.5 mm Sub-Mini) Remote Input | 1x Micro-USB (USB 2.0) Data Output" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "Wi-Fi 4 (802.11n), Bluetooth 4.1" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: Canon Camera Connect | Functionality: Access Stored Files, Adjust Settings, Firmware Update, Remote Control, View Live Feed" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Adapter Required, Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Size", + "value": "3.0\"" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "1,040,000 Dot" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Articulating Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Secondary Display", + "value": "Top: Status Display" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Optical (Pentaprism)" + }, + { + "group": "Viewfinder", + "label": "Eye Point", + "value": "22 mm" + }, + { + "group": "Viewfinder", + "label": "Coverage", + "value": "100%" + }, + { + "group": "Viewfinder", + "label": "Magnification", + "value": "Approx. 0.95x" + }, + { + "group": "Viewfinder", + "label": "Diopter Adjustment", + "value": "-3 to +1" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Continuous-Servo AF, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Phase Detection: 45 (45 Cross-Type)" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-3 to +18 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "Yes, Flash Only" + }, + { + "group": "Flash", + "label": "Flash Modes", + "value": "Auto, Manual" + }, + { + "group": "Flash", + "label": "Guide Number", + "value": "39.37' / 12 m at ISO 100" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "1/250 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-3 to +3 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "eTTL" + }, + { + "group": "Flash", + "label": "External Flash Connection", + "value": "Shoe Mount" + }, + { + "group": "General", + "label": "Battery", + "value": "1x LP-E6N Rechargeable Lithium-Ion, 7.2 VDC, 1865 mAh (Included) |  • Approx. 1300 Shots" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mounting Thread", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Material of Construction", + "value": "Magnesium Alloy, Polycarbonate" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C up to 85% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "5.54 x 4.13 x 3.02\" / 140.7 x 104.8 x 76.8 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "1.4 lb / 619 g (Body Only) | 1.5 lb / 701 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.8 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "12.4 x 8.8 x 4.6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1502488-GREY/canon_3616c016_eos_90d_dslr_camera.html", + "archive_url": "https://web.archive.org/web/20250426172154/https://www.bhphotovideo.com/c/product/1502488-GREY/canon_3616c016_eos_90d_dslr_camera.html", + "archive_timestamp": "20250426172154", + "fetched_at": "2026-09-12T17:27:26Z" + } + }, + { + "slug": "canon-eos-90d-dslr-camera-with-18-135mm-lens", + "name": "Canon EOS 90D DSLR Camera with 18-135mm Lens", + "brand": "Canon", + "bh_sku": "CAE90D18135", + "mpn": "3616C016", + "department_slug": "photography", + "subcategory_slug": "dslr-cameras", + "product_type": "DSLR Camera", + "price_usd": 1599.0, + "availability": "In Stock", + "condition": "New", + "description": "Situated as a versatile camera with capable photo and video traits, the Canon EOS 90D is a sleek DSLR also characterized by its high-resolution 32.5MP APS-C CMOS sensor. This updated sensor design achieves enhanced image clarity, resolution, and dynamic range, along with adept sensitivity to ISO 25600 and low noise to suit working in a variety of situations. Combined with advanced image processing, this sensor is also capable of outputting UHD 4K30p and Full HD 120p video, as well as supporting continuous stills shooting rates up to 10 fps. When working with the optical viewfinder, an apt 45-point all cross-type AF system affords fast performance in a range of lighting conditions for tracking moving subjects and working in low light, while the 5481-point Dual Pixel CMOS AF system benefits live-view shooting and movie recording by providing a smooth, natural focusing quality akin to the way a camcorder acquires focus. Complementing the imaging capabilities, the 90D sports a vari-angle touchscreen LCD for intuitive control and compositional freedom, and an optical pentaprism viewfinder provides a bright, clear, and realistic viewing means characteristic of the DSLR shooting experienc", + "mount_type": "Canon EF-S", + "sensor_size": "22.3 x 14.8 mm (APS-C) CMOS", + "focal_length": null, + "connectivity": "Wi-Fi 4 (802.11n), Bluetooth 4.1", + "megapixels": 32.5, + "capacity_gb": null, + "image_path": "images/products/cae90d18135.jpg", + "image_sha256": "b55450730ccf7a7681ccd5a7c462d386290f297445243665bdfba6b35cd17306", + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Canon EF-S" + }, + { + "group": "Key Specs", + "label": "Sensor Resolution", + "value": "Actual: 34.4 Megapixel | Effective: 32.5 Megapixel (6960 x 4640)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "22.3 x 14.8 mm (APS-C) CMOS" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Digital (Video Only)" + }, + { + "group": "Key Specs", + "label": "ISO Sensitivity Range", + "value": "Photo | 100 to 25,600 in Manual, Auto Mode (Extended: 51,200) | Video | 100 to 12,800 in Manual, Auto Mode (Extended: 25,600)" + }, + { + "group": "Key Specs", + "label": "Internal Recording Modes", + "value": "H.264/MP4 | UHD 4K (3840 x 2160) at 23.98/25/29.97 fps [120 Mb/s VBR] | 1920 x 1080p at 23.98/25/29.97/50/59.94/100/120 fps [12 to 120 Mb/s VBR] | 1280 x 720 at 50/59.94 fps [26 Mb/s VBR]" + }, + { + "group": "Key Specs", + "label": "External Recording Modes", + "value": "4:2:2 8-Bit via HDMI | UHD 4K (3840 x 2160) at 25/29.97 fps | 1920 x 1080p" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-II)" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Mini-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x Micro-USB (USB 2.0) Data Output | 1x Canon E3 (2.5 mm Sub-Mini) Remote Input" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Wi-Fi 4 (802.11n), Bluetooth 4.1" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Articulating Touchscreen LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x LP-E6N Rechargeable Lithium-Ion, 7.2 VDC, 1865 mAh (Included) |  • Approx. 1300 Shots" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Canon EF-S" + }, + { + "group": "Imaging", + "label": "Sensor Resolution", + "value": "Actual: 34.4 Megapixel | Effective: 32.5 Megapixel (6960 x 4640)" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "22.3 x 14.8 mm (APS-C) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1.6x | *Additional Crop Occurs in Select Video Modes" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Digital (Video Only)" + }, + { + "group": "Imaging", + "label": "Mirror Lock-Up", + "value": "Yes" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Mechanical Focal Plane Shutter and Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Mechanical Shutter | 1/8000 to 30 Seconds | Electronic Shutter | 1/16000 to 30 Seconds" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb Mode" + }, + { + "group": "Exposure Control", + "label": "ISO Sensitivity Range", + "value": "Photo | 100 to 25,600 in Manual, Auto Mode (Extended: 51,200) | Video | 100 to 12,800 in Manual, Auto Mode (Extended: 25,600)" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Evaluative, Partial, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-5 to +5 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "1 to 20 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "2500 to 10,000K | Presets: Auto, Cloudy, Color Temperature, Custom, Daylight, Flash, Fluorescent (White), Shade, Tungsten" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 10 fps at Maximum Resolution for up to 25 Frames (Raw) / 58 Frames (JPEG)" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/10-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 3:2, 4:3, 16:9" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "JPEG, Raw" + }, + { + "group": "Still Image Capture", + "label": "Bit Depth", + "value": "14-Bit" + }, + { + "group": "Video Capture", + "label": "Internal Recording Modes", + "value": "H.264/MP4 | UHD 4K (3840 x 2160) at 23.98/25/29.97 fps [120 Mb/s VBR] | 1920 x 1080p at 23.98/25/29.97/50/59.94/100/120 fps [12 to 120 Mb/s VBR] | 1280 x 720 at 50/59.94 fps [26 Mb/s VBR]" + }, + { + "group": "Video Capture", + "label": "External Recording Modes", + "value": "4:2:2 8-Bit via HDMI | UHD 4K (3840 x 2160) at 25/29.97 fps | 1920 x 1080p" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "30-Minute Maximum | 8-Minute Maximum in 1080p HFR" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "AAC Audio | LPCM Audio" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-II)" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Mini-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "No" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x Micro-USB (USB 2.0) Data Output | 1x Canon E3 (2.5 mm Sub-Mini) Remote Input" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "Wi-Fi 4 (802.11n), Bluetooth 4.1" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: Canon Camera Connect | Functionality: Access Stored Files, Adjust Settings, Firmware Update, Remote Control, View Live Feed" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Adapter Required, Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Size", + "value": "3.0\"" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "1,040,000 Dot" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Articulating Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Secondary Display", + "value": "Top: Status Display" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Optical (Pentaprism)" + }, + { + "group": "Viewfinder", + "label": "Eye Point", + "value": "22 mm" + }, + { + "group": "Viewfinder", + "label": "Coverage", + "value": "100%" + }, + { + "group": "Viewfinder", + "label": "Magnification", + "value": "Approx. 0.95x" + }, + { + "group": "Viewfinder", + "label": "Diopter Adjustment", + "value": "-3 to +1" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Continuous-Servo AF, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Phase Detection: 45 (45 Cross-Type)" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-3 to +18 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "Yes, Flash Only" + }, + { + "group": "Flash", + "label": "Flash Modes", + "value": "Auto, Manual" + }, + { + "group": "Flash", + "label": "Guide Number", + "value": "39.37' / 12 m at ISO 100" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "1/250 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-3 to +3 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "eTTL" + }, + { + "group": "Flash", + "label": "External Flash Connection", + "value": "Shoe Mount" + }, + { + "group": "General", + "label": "Battery", + "value": "1x LP-E6N Rechargeable Lithium-Ion, 7.2 VDC, 1865 mAh (Included) |  • Approx. 1300 Shots" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mounting Thread", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Material of Construction", + "value": "Magnesium Alloy, Polycarbonate" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C up to 85% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "5.54 x 4.13 x 3.02\" / 140.7 x 104.8 x 76.8 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "1.5 lb / 701 g (With Battery, Recording Media) | 1.4 lb / 619 g (Body Only)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.8 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "12.4 x 8.8 x 4.6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1502489-GREY/canon_3616c016_eos_90d_dslr_camera.html", + "archive_url": "https://web.archive.org/web/20250322071522/https://www.bhphotovideo.com/c/product/1502489-GREY/canon_3616c016_eos_90d_dslr_camera.html", + "archive_timestamp": "20250322071522", + "fetched_at": "2026-09-12T17:27:26Z" + } + }, + { + "slug": "pentax-kf-dslr-camera-with-18-55mm-and-55-300mm-lenses-kit", + "name": "Pentax KF DSLR Camera with 18-55mm and 55-300mm Lenses Kit", + "brand": "Pentax", + "bh_sku": "PEKFB1855LKQ", + "mpn": null, + "department_slug": "photography", + "subcategory_slug": "dslr-cameras", + "product_type": "DSLR Camera", + "price_usd": 1093.9, + "availability": "In Stock", + "condition": "New", + "description": "Bundling the reliable DSLR body with a pair of versatile zooms, the Pentax KF DSLR Camera with 18-55mm and 55-300mm Lenses Kit from B&H joins the compact APS-C camera with the DA 18-55mm f/3.5-5.6 AL WR zoom lens and the HD PENTAX-DA 55-300mm f/4.5-6.3 ED PLM WR RE telephoto zoom.", + "mount_type": "Pentax K", + "sensor_size": "23.5 x 15.6 mm (APS-C) CMOS", + "focal_length": null, + "connectivity": "Wi-Fi 4 (802.11n)", + "megapixels": 24.24, + "capacity_gb": null, + "image_path": "images/products/pekfb1855lkq.jpg", + "image_sha256": "ea1e191505e21530c2ea8eb1315eeed5644eddeb9077835eca158f8f19f24def", + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Pentax K" + }, + { + "group": "Key Specs", + "label": "Sensor Resolution", + "value": "Actual: 24.78 Megapixel | Effective: 24.24 Megapixel (6000 x 4000)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "23.5 x 15.6 mm (APS-C) CMOS" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Sensor-Shift" + }, + { + "group": "Key Specs", + "label": "ISO Sensitivity Range", + "value": "100 to 102,400 in Manual, Auto Mode" + }, + { + "group": "Key Specs", + "label": "Internal Recording Modes", + "value": "H.264/MPEG-4 AVC | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps | 1280 x 720 at 50/59.94 fps" + }, + { + "group": "Key Specs", + "label": "External Recording Modes", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-I)" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x Micro-USB (USB 2.0) Data Output" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Wi-Fi 4 (802.11n)" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Articulating Non-Touchscreen LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x D-LI109 Rechargeable Lithium-Ion, 7.4 VDC, 1050 mAh (Included)" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Pentax K" + }, + { + "group": "Imaging", + "label": "Sensor Resolution", + "value": "Actual: 24.78 Megapixel | Effective: 24.24 Megapixel (6000 x 4000)" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "23.5 x 15.6 mm (APS-C) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1.5x" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Sensor-Shift" + }, + { + "group": "Imaging", + "label": "Mirror Lock-Up", + "value": "Yes" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Front Curtain Shutter | 1/6000 to 30 Seconds in Auto Mode | 1/6000 to 30 Seconds in Manual Mode" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb & Time Mode (10 to 1200 Seconds)" + }, + { + "group": "Exposure Control", + "label": "ISO Sensitivity Range", + "value": "100 to 102,400 in Manual, Auto Mode" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Sensitivity Priority, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-5 to +5 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "0 to 22 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Presets: Auto, CTE, Cloudy, Daylight, Fluorescent, Fluorescent (Cool White), Fluorescent (Day White), Fluorescent (Warm White), Manual, Multi Auto WB, Shade, Tungsten" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 6 fps at Maximum Resolution for up to 10 Frames (Raw) / 40 Frames (JPEG)" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/12-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "3:2" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "JPEG, Raw" + }, + { + "group": "Still Image Capture", + "label": "Bit Depth", + "value": "14-Bit" + }, + { + "group": "Video Capture", + "label": "Internal Recording Modes", + "value": "H.264/MPEG-4 AVC | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps | 1280 x 720 at 50/59.94 fps" + }, + { + "group": "Video Capture", + "label": "External Recording Modes", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "25-Minute Maximum" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-I)" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "No" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x Micro-USB (USB 2.0) Data Output" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "Wi-Fi 4 (802.11n)" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: Image Sync | Functionality: Adjust Settings, Remote Control" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Adapter Required" + }, + { + "group": "Monitor", + "label": "Display Size", + "value": "3\"" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "1,037,000 Dot" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Articulating Non-Touchscreen LCD" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Optical" + }, + { + "group": "Viewfinder", + "label": "Coverage", + "value": "100%" + }, + { + "group": "Viewfinder", + "label": "Magnification", + "value": "Approx. 95x" + }, + { + "group": "Viewfinder", + "label": "Diopter Adjustment", + "value": "-2.5 to +1.5" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Automatic, Continuous-Servo AF, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Photo | Phase Detection: 11 (9 Cross-Type)" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-3 to +18 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "Yes, Flash Only" + }, + { + "group": "Flash", + "label": "Flash Modes", + "value": "Auto, Auto/Red-Eye Reduction, Flash On, Flash On w/ Red-Eye Reduction, Manual, Second-Curtain Sync, Slow Sync" + }, + { + "group": "Flash", + "label": "Guide Number", + "value": "39.3' / 12 m at ISO 100 (28 mm Position)" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "1/180 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-2 to +1 EV" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "P-TTL" + }, + { + "group": "Flash", + "label": "External Flash Connection", + "value": "Wireless" + }, + { + "group": "General", + "label": "Battery", + "value": "1x D-LI109 Rechargeable Lithium-Ion, 7.4 VDC, 1050 mAh (Included)" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mounting Thread", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "14 to 104°F / -10 to 40°C up to 85% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "4.9 x 3.7 x 2.9\" / 125.5 x 93 x 74 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "22.0 oz / 625 g (Body Only) | 24.1 oz / 683 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.73 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "8.3 x 6.9 x 5\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1803239-REG/pentax_pentax_kf_dslr_camera.html", + "archive_url": "https://web.archive.org/web/20250419081907/https://www.bhphotovideo.com/c/product/1803239-REG/pentax_pentax_kf_dslr_camera.html", + "archive_timestamp": "20250419081907", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "pentax-kf-dslr-camera-with-smc-da-50mm-f-1-8-lens-kit", + "name": "Pentax KF DSLR Camera with smc DA 50mm f/1.8 Lens Kit", + "brand": "Pentax", + "bh_sku": "PEKFBB50K", + "mpn": null, + "department_slug": "photography", + "subcategory_slug": "dslr-cameras", + "product_type": "DSLR Camera", + "price_usd": 713.9, + "availability": "In Stock", + "condition": "New", + "description": "Pairing the durable DSLR body with a classic focal length lens, the Pentax KF DSLR Camera with smc DA 50mm f/1.8 Lens Kit from B&H joins the compact APS-C camera with the smc DA 50mm f/1.8 lens.", + "mount_type": "Pentax K", + "sensor_size": "23.5 x 15.6 mm (APS-C) CMOS", + "focal_length": null, + "connectivity": "Wi-Fi 4 (802.11n)", + "megapixels": 24.24, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Pentax K" + }, + { + "group": "Key Specs", + "label": "Sensor Resolution", + "value": "Actual: 24.78 Megapixel | Effective: 24.24 Megapixel (6000 x 4000)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "23.5 x 15.6 mm (APS-C) CMOS" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Sensor-Shift" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 102,400 to" + }, + { + "group": "Key Specs", + "label": "Internal Recording Modes", + "value": "H.264/MPEG-4 AVC | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps | 1280 x 720 at 50/59.94 fps" + }, + { + "group": "Key Specs", + "label": "External Recording Modes", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-I)" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x Micro-USB (USB 2.0) Data Output" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Wi-Fi 4 (802.11n)" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Articulating Non-Touchscreen LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x D-LI109 Rechargeable Lithium-Ion, 7.4 VDC, 1050 mAh (Included)" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Pentax K" + }, + { + "group": "Imaging", + "label": "Sensor Resolution", + "value": "Actual: 24.78 Megapixel | Effective: 24.24 Megapixel (6000 x 4000)" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "23.5 x 15.6 mm (APS-C) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1.5x" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Sensor-Shift" + }, + { + "group": "Imaging", + "label": "Mirror Lock-Up", + "value": "Yes" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Front Curtain Shutter | 1/6000 to 30 Seconds in Auto Mode | 1/6000 to 30 Seconds in Manual Mode" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb & Time Mode (10 to 1200 Seconds)" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 102,400 to" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Sensitivity Priority, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-5 to +5 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "0 to 22 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Presets: Auto, CTE, Cloudy, Daylight, Fluorescent, Fluorescent (Cool White), Fluorescent (Day White), Fluorescent (Warm White), Manual, Multi Auto WB, Shade, Tungsten" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 6 fps at Maximum Resolution for up to 10 Frames (Raw) / 40 Frames (JPEG)" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/12-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "3:2" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "JPEG, Raw" + }, + { + "group": "Still Image Capture", + "label": "Bit Depth", + "value": "14-Bit" + }, + { + "group": "Video Capture", + "label": "Internal Recording Modes", + "value": "H.264/MPEG-4 AVC | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps | 1280 x 720 at 50/59.94 fps" + }, + { + "group": "Video Capture", + "label": "External Recording Modes", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "25-Minute Maximum" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-I)" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "No" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x Micro-USB (USB 2.0) Data Output" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "Wi-Fi 4 (802.11n)" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: Image Sync | Functionality: Adjust Settings, Remote Control" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Adapter Required" + }, + { + "group": "Monitor", + "label": "Display Size", + "value": "3\"" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "1,037,000 Dot" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Articulating Non-Touchscreen LCD" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Optical" + }, + { + "group": "Viewfinder", + "label": "Coverage", + "value": "100%" + }, + { + "group": "Viewfinder", + "label": "Magnification", + "value": "Approx. 95x" + }, + { + "group": "Viewfinder", + "label": "Diopter Adjustment", + "value": "-2.5 to +1.5" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Automatic, Continuous-Servo AF, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Photo | Phase Detection: 11 (9 Cross-Type)" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-3 to +18 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "Yes, Flash Only" + }, + { + "group": "Flash", + "label": "Flash Modes", + "value": "Auto, Auto/Red-Eye Reduction, Flash On, Flash On w/ Red-Eye Reduction, Manual, Second-Curtain Sync, Slow Sync" + }, + { + "group": "Flash", + "label": "Guide Number", + "value": "39.3' / 12 m at ISO 100 (28 mm Position)" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "1/180 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-2 to +1 EV" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "P-TTL" + }, + { + "group": "Flash", + "label": "External Flash Connection", + "value": "Wireless" + }, + { + "group": "General", + "label": "Battery", + "value": "1x D-LI109 Rechargeable Lithium-Ion, 7.4 VDC, 1050 mAh (Included)" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mounting Thread", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "14 to 104°F / -10 to 40°C up to 85% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "4.9 x 3.7 x 2.9\" / 125.5 x 93 x 74 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "22.0 oz / 625 g (Body Only) | 24.1 oz / 683 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.73 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "8.3 x 6.9 x 5\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1803230-REG/pentax_kf_dslr_camera_with.html", + "archive_url": "https://web.archive.org/web/20250524054639/https://www.bhphotovideo.com/c/product/1803230-REG/pentax_kf_dslr_camera_with.html", + "archive_timestamp": "20250524054639", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "angelbird-performance-cfexpress-type-b-card-reader", + "name": "Angelbird Performance CFexpress Type B Card Reader", + "brand": "Angelbird", + "bh_sku": "ANCFXBCRP", + "mpn": "CFXBCRP", + "department_slug": "photography", + "subcategory_slug": "memory-cards-storage", + "product_type": "Storage", + "price_usd": 259.99, + "availability": "In Stock", + "condition": "New", + "description": "Engineered for high-speed workflows, the Performance CFexpress Type B Card Reader from Angelbird is a post-production tool that delivers maximum efficiency when working with raw video files or ultra-high-resolution photos. This card reader is equipped with one CFexpress Type B slot and connects to your host Windows, Mac, iOS, iPadOS, Linux, or Android device using an integrated USB-C port, which supports the 40 Gb/s USB4 standard while also providing bus power. Also featured is an active cooling system that helps prevent overheating and thermal throttling, even under heavy workloads, an LED indicator for device feedback, and SolidConnect technology, which provides a recessed USB port within the drive's housing that helps protect the connection. Included is a 12.6\" USB4 cable with USB-C connectors on both ends and a Solid Flex design for enhanced durability.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/ancfxbcrp.jpg", + "image_sha256": "8718b378d2882a0976c10e6137db20fb5e0b94ad36eb5de85fd2cfd7b3ea9189", + "specs": [ + { + "group": "Specifications", + "label": "Media Card Reader", + "value": "1x CFexpress Type B" + }, + { + "group": "Specifications", + "label": "Host Connection", + "value": "USB-C (USB4) via Detachable Cable" + }, + { + "group": "Specifications", + "label": "Power Source", + "value": "Bus Powered" + }, + { + "group": "Specifications", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C at 5 to 95% Humidity" + }, + { + "group": "Specifications", + "label": "Storage Conditions", + "value": "-13 to 158°F / -25 to 70°C" + }, + { + "group": "Specifications", + "label": "Certifications", + "value": "BSMI, CE, FCC, KC, RCM, REACH, RoHS, UKCA, VCCI" + }, + { + "group": "Specifications", + "label": "Cable Length", + "value": "12.6\" / 32 cm" + }, + { + "group": "Specifications", + "label": "Dimensions", + "value": "3.84 x 2.56 x 0.85\" / 9.75 x 6.5 x 2.16 cm" + }, + { + "group": "Specifications", + "label": "Weight", + "value": "6.2 oz / 175 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.615 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "5.5 x 4.2 x 2\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1908749-REG/angelbird_cfxbcrp_performance_cfexpress_type_b.html", + "archive_url": "https://web.archive.org/web/20260301114307/https://www.bhphotovideo.com/c/product/1908749-REG/angelbird_cfxbcrp_performance_cfexpress_type_b.html", + "archive_timestamp": "20260301114307", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "delkin-devices-1tb-power-uhs-ii-microsdxc-memory-card-with-sd-adapter", + "name": "Delkin Devices 1TB POWER UHS-II microSDXC Memory Card with SD Adapter", + "brand": "Delkin Devices", + "bh_sku": "DEDMPWV91T", + "mpn": "DMPWV91T", + "department_slug": "photography", + "subcategory_slug": "memory-cards-storage", + "product_type": "Storage", + "price_usd": 799.99, + "availability": "In Stock", + "condition": "New", + "description": "Designed for professional photographers and videographers, the 1TB POWER UHS-II microSDXC Memory Card from Delkin Devices features a storage capacity of 1TB and takes advantage of the UHS-II bus to support maximum read speeds of 300 MB/s and maximum write speeds of 250 MB/s. This card has also been designed with the V90 Video Speed Class rating, which guarantees minimum write speeds of at least 90 MB/s. All of this allows for users to capture 8K, 4K, 3D, HDR, high-speed and high-frame-rate recordings, and multiple video streams created by 360° cameras. It also supports data-intensive simultaneous captures, such as raw and JPEG, as well as video, still, GPS data, and time-lapse.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": 1024, + "image_path": "images/products/dedmpwv91t.jpg", + "image_sha256": "7d2753506e3e827ffa87d7ffeff53d4825d36cac245112e7917069c355082e0a", + "specs": [ + { + "group": "Specifications", + "label": "Quantity", + "value": "1" + }, + { + "group": "Specifications", + "label": "Card Type", + "value": "microSDXC with Full-Size SD Adapter" + }, + { + "group": "Specifications", + "label": "Storage Capacity", + "value": "1 TB" + }, + { + "group": "Specifications", + "label": "Bus Type", + "value": "UHS-II" + }, + { + "group": "Specifications", + "label": "Speed Class", + "value": "Class 10 / U3 / V90" + }, + { + "group": "Specifications", + "label": "Read Speed", + "value": "Maximum: 300 MB/s" + }, + { + "group": "Specifications", + "label": "Write Speed", + "value": "Maximum: 250 MB/s | Minimum: 90 MB/s" + }, + { + "group": "Specifications", + "label": "Built-in Write-Protect Switch", + "value": "On Adapter Only" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.04 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "5.25 x 3.75 x 0.5\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1926844-REG/delkin_devices_dmpwv91t_p_1tb_power_uhs_ii_microsdxc.html", + "archive_url": "https://web.archive.org/web/20260214132544/https://www.bhphotovideo.com/c/product/1926844-REG/delkin_devices_dmpwv91t_p_1tb_power_uhs_ii_microsdxc.html", + "archive_timestamp": "20260214132544", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "delkin-devices-512gb-power-uhs-ii-microsdxc-memory-card-with-sd-adapter", + "name": "Delkin Devices 512GB POWER UHS-II microSDXC Memory Card with SD Adapter", + "brand": "Delkin Devices", + "bh_sku": "DEDMPWV9512", + "mpn": "DMPWV9512", + "department_slug": "photography", + "subcategory_slug": "memory-cards-storage", + "product_type": "Storage", + "price_usd": 419.99, + "availability": "In Stock", + "condition": "New", + "description": "Designed for professional photographers and videographers, the 512GB POWER UHS-II microSDXC Memory Card from Delkin Devices features a storage capacity of 512GB and takes advantage of the UHS-II bus to support maximum read speeds of 300 MB/s and maximum write speeds of 250 MB/s. This card has also been designed with the V90 Video Speed Class rating, which guarantees minimum write speeds of at least 90 MB/s. All of this allows for users to capture 8K, 4K, 3D, HDR, high-speed and high-frame-rate recordings, and multiple video streams created by 360° cameras. It also supports data-intensive simultaneous captures, such as raw and JPEG, as well as video, still, GPS data, and time-lapse.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": 512, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Specifications", + "label": "Quantity", + "value": "1" + }, + { + "group": "Specifications", + "label": "Card Type", + "value": "microSDXC with Full-Size SD Adapter" + }, + { + "group": "Specifications", + "label": "Storage Capacity", + "value": "512 GB" + }, + { + "group": "Specifications", + "label": "Bus Type", + "value": "UHS-II" + }, + { + "group": "Specifications", + "label": "Speed Class", + "value": "Class 10 / U3 / V90" + }, + { + "group": "Specifications", + "label": "Read Speed", + "value": "Maximum: 300 MB/s" + }, + { + "group": "Specifications", + "label": "Write Speed", + "value": "Maximum: 250 MB/s | Minimum: 90 MB/s" + }, + { + "group": "Specifications", + "label": "Built-in Write-Protect Switch", + "value": "On Adapter Only" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.04 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "5.5 x 3.75 x 0.5\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1926845-REG/delkin_devices_dmpwv9512_512gb_power_uhs_ii_microsdxc.html", + "archive_url": "https://web.archive.org/web/20260211104217/https://www.bhphotovideo.com/c/product/1926845-REG/delkin_devices_dmpwv9512_512gb_power_uhs_ii_microsdxc.html", + "archive_timestamp": "20260211104217", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "sandisk-1tb-pokemon-uhs-i-microsdxc-memory-card", + "name": "SanDisk 1TB Pokemon UHS-I microSDXC Memory Card", + "brand": "SanDisk", + "bh_sku": "SASQAO1TG6ZK", + "mpn": "SDSQXAO-1T00-GN6ZK", + "department_slug": "photography", + "subcategory_slug": "memory-cards-storage", + "product_type": "Storage", + "price_usd": 229.99, + "availability": "In Stock", + "condition": "New", + "description": "Play your games in style with this officially licensed 1TB Pokemon UHS-I microSDXC Memory Card from SanDisk. Snorlax adds flair to this card, which has been designed, tested, and approved for use with all Nintendo Switch systems, although it will work in other devices that support microSD.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": 1024, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Specifications", + "label": "Quantity", + "value": "1" + }, + { + "group": "Specifications", + "label": "Card Type", + "value": "microSDXC" + }, + { + "group": "Specifications", + "label": "Storage Capacity", + "value": "1 TB" + }, + { + "group": "Specifications", + "label": "Bus Type", + "value": "UHS-I" + }, + { + "group": "Specifications", + "label": "Speed Class", + "value": "Class 10 / U3 / V30" + }, + { + "group": "Specifications", + "label": "Read Speed", + "value": "Maximum: 100 MB/s" + }, + { + "group": "Specifications", + "label": "Write Speed", + "value": "Maximum: 90 MB/s | Minimum: 30 MB/s" + }, + { + "group": "Specifications", + "label": "Built-in Write-Protect Switch", + "value": "No" + }, + { + "group": "Specifications", + "label": "Operating Conditions", + "value": "-13 to 185°F / -25 to 85°C" + }, + { + "group": "Specifications", + "label": "Storage Conditions", + "value": "-40 to 185°F / -40 to 85°C" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.02 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6 x 4 x 0.2\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1936052-REG/sandisk_sdsqxao_1t00_gn6zk_1tb_pokemon_microsd_card.html", + "archive_url": "https://web.archive.org/web/20260213183309/https://www.bhphotovideo.com/c/product/1936052-REG/sandisk_sdsqxao_1t00_gn6zk_1tb_pokemon_microsd_card.html", + "archive_timestamp": "20260213183309", + "fetched_at": "2026-09-12T17:27:30Z" + } + }, + { + "slug": "sandisk-256gb-pokemon-uhs-i-microsdxc-memory-card", + "name": "SanDisk 256GB Pokemon UHS-I microSDXC Memory Card", + "brand": "SanDisk", + "bh_sku": "SASQAO2566ZK", + "mpn": "SDSQXAO-256G-GN6ZK", + "department_slug": "photography", + "subcategory_slug": "memory-cards-storage", + "product_type": "Storage", + "price_usd": 66.99, + "availability": "In Stock", + "condition": "New", + "description": "Play your games in style with this officially licensed 256GB Pokemon UHS-I microSDXC Memory Card from SanDisk. Pikachu adds flair to this card, which has been designed, tested, and approved for use with all Nintendo Switch systems, although it will work in other devices that support microSD.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": 256, + "image_path": "images/products/sasqao2566zk.jpg", + "image_sha256": "73a0c62370a1c08ecb62e93164fdb285145b3a8d8b48b2299464588da4dc72f1", + "specs": [ + { + "group": "Specifications", + "label": "Quantity", + "value": "1" + }, + { + "group": "Specifications", + "label": "Card Type", + "value": "microSDXC" + }, + { + "group": "Specifications", + "label": "Storage Capacity", + "value": "256 GB" + }, + { + "group": "Specifications", + "label": "Bus Type", + "value": "UHS-I" + }, + { + "group": "Specifications", + "label": "Speed Class", + "value": "Class 10 / U3 / V30" + }, + { + "group": "Specifications", + "label": "Read Speed", + "value": "Maximum: 100 MB/s" + }, + { + "group": "Specifications", + "label": "Write Speed", + "value": "Maximum: 90 MB/s | Minimum: 30 MB/s" + }, + { + "group": "Specifications", + "label": "Built-in Write-Protect Switch", + "value": "No" + }, + { + "group": "Specifications", + "label": "Operating Conditions", + "value": "-13 to 185°F / -25 to 85°C" + }, + { + "group": "Specifications", + "label": "Storage Conditions", + "value": "-40 to 185°F / -40 to 85°C" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.02 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "5.95 x 3.95 x 0.15\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1936053-REG/sandisk_sdsqxao_256g_gn6zk_256gb_pokemon_microsd_card.html", + "archive_url": "https://web.archive.org/web/20260213075003/https://www.bhphotovideo.com/c/product/1936053-REG/sandisk_sdsqxao_256g_gn6zk_256gb_pokemon_microsd_card.html", + "archive_timestamp": "20260213075003", + "fetched_at": "2026-09-12T17:27:30Z" + } + }, + { + "slug": "sandisk-2tb-ssd-plus-sata-iii-2-5-internal-ssd", + "name": "SanDisk 2TB SSD Plus SATA III 2.5\" Internal SSD", + "brand": "SanDisk", + "bh_sku": "SASSD2TG28", + "mpn": "SDSSDA-2T00-G28", + "department_slug": "photography", + "subcategory_slug": "memory-cards-storage", + "product_type": "Storage", + "price_usd": 459.99, + "availability": "In Stock", + "condition": "New", + "description": "Inject new life into your system with the 2TB SSD Plus SATA III 2.5\" Internal SSD from SanDisk. Designed for web browsing, gaming, productivity, and photo/video editing, this SSD allows users to store up to 2TB of data. It is equipped with a SATA III 6 Gb/s interface and fits into your system's 2.5\" / 7mm drive bay, providing sequential write speeds of up to 515 MB/s and sequential read speeds of up to 545 MB/s. In addition to its enhanced data transfer rates when compared to traditional hard drives, this drive also offers an MTTF (Mean Time to Failure) rating of 2 million hours, is shock resistant, uses 3D NAND flash memory, and employs SLC caching to boost burst write performance. Using Acronis' free and downloadable True Image software, you'll be able to more easily migrate your existing data to this drive.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": 2048, + "image_path": "images/products/sassd2tg28.jpg", + "image_sha256": "a10f927f6a4f4a93856452a04acfb9a0eec79dcbeeb0872e26d34feb9a7e808a", + "specs": [ + { + "group": "Key Specs", + "label": "Total Capacity", + "value": "2 TB" + }, + { + "group": "Key Specs", + "label": "Drive Type", + "value": "SATA III / 2.5\" SSD" + }, + { + "group": "Key Specs", + "label": "Read Speed", + "value": "Sequential: 545 MB/s" + }, + { + "group": "Key Specs", + "label": "Write Speed", + "value": "Sequential: 515 MB/s" + }, + { + "group": "Key Specs", + "label": "Total Capacity", + "value": "2 TB" + }, + { + "group": "Key Specs", + "label": "Drive Type", + "value": "SATA III / 2.5\" SSD" + }, + { + "group": "Performance", + "label": "Read Speed", + "value": "Sequential: 545 MB/s" + }, + { + "group": "Performance", + "label": "Write Speed", + "value": "Sequential: 515 MB/s" + }, + { + "group": "Performance", + "label": "Encryption Support", + "value": "No" + }, + { + "group": "Performance", + "label": "Mean Time Between Failures (MTBF)", + "value": "2.0 Million Hours" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 158°F / 0 to 70°C" + }, + { + "group": "General", + "label": "Operating Shock", + "value": "1500 G / 0.5 ms" + }, + { + "group": "General", + "label": "Storage Conditions", + "value": "-67 to 185°F / -55 to 85°C" + }, + { + "group": "General", + "label": "Dimensions", + "value": "4 x 2.75 x 0.3\" / 100.5 x 69.85 x 7 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "1.2 oz / 32.7 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.13 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.95 x 5.3 x 0.4\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1917037-REG/sandisk_sdssda_2t00_g28_2tb_ssd_plus_internal.html", + "archive_url": "https://web.archive.org/web/20260718045432/https://www.bhphotovideo.com/c/product/1917037-REG/sandisk_sdssda_2t00_g28_2tb_ssd_plus_internal.html", + "archive_timestamp": "20260718045432", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "sandisk-512gb-extreme-pro-cfexpress-type-b-memory-card-with-128gb-extreme-pro-uhs-ii-sdxc-memory-card", + "name": "SanDisk 512GB Extreme PRO CFexpress Type B Memory Card with 128GB Extreme PRO UHS-II SDXC Memory Card", + "brand": "SanDisk", + "bh_sku": "SACFEP512K11", + "mpn": null, + "department_slug": "photography", + "subcategory_slug": "memory-cards-storage", + "product_type": "Storage", + "price_usd": 319.98, + "availability": "In Stock", + "condition": "New", + "description": "This B&H Kit bundles a SanDisk 512GB Extreme PRO CFexpress Type B Memory Card with a SanDisk 128GB Extreme PRO UHS-II SDXC Memory Card. This kit is suitable for anyone who needs one CFexpress Type B card and one UHS-II SDXC card, or cameras with one CFexpress Type B card slot and one UHS-II SDXC card slot, such as the Nikon D850.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": 512, + "image_path": "images/products/sacfep512k11.jpg", + "image_sha256": "a2c0b40177f2a952e0943742945e6398499c4ba7018124e0decb8a97513056cc", + "specs": [ + { + "group": "Specifications", + "label": "Quantity", + "value": "1" + }, + { + "group": "Specifications", + "label": "Card Type", + "value": "CFexpress Type B" + }, + { + "group": "Specifications", + "label": "Storage Capacity", + "value": "512 GB" + }, + { + "group": "Specifications", + "label": "Read Speed", + "value": "Maximum: 1700 MB/s" + }, + { + "group": "Specifications", + "label": "Write Speed", + "value": "Maximum: 1400 MB/s" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.055 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.4 x 4.3 x 2.1\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1911648-REG/sandisk_512gb_extreme_pro_cfexpress.html", + "archive_url": "https://web.archive.org/web/20260128144428/https://www.bhphotovideo.com/c/product/1911648-REG/sandisk_512gb_extreme_pro_cfexpress.html", + "archive_timestamp": "20260128144428", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "sandisk-512gb-extreme-pro-cfexpress-type-b-memory-card-with-64gb-extreme-pro-uhs-ii-sdxc-memory-card", + "name": "SanDisk 512GB Extreme PRO CFexpress Type B Memory Card with 64GB Extreme PRO UHS-II SDXC Memory Card", + "brand": "SanDisk", + "bh_sku": "SACFEP512K10", + "mpn": null, + "department_slug": "photography", + "subcategory_slug": "memory-cards-storage", + "product_type": "Storage", + "price_usd": 239.98, + "availability": "In Stock", + "condition": "New", + "description": "This B&H Kit bundles a SanDisk 512GB Extreme PRO CFexpress Type B Memory Card with a SanDisk 64GB Extreme PRO UHS-II SDXC Memory Card. This kit is suitable for anyone who needs one CFexpress Type B card and one UHS-II SDXC card, or cameras with one CFexpress Type B card slot and one UHS-II SDXC card slot, such as the Nikon D850.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": 512, + "image_path": "images/products/sacfep512k10.jpg", + "image_sha256": "eaad3c4c41ba9eb0cbcd6b83b95cdac5052cb539f139a71fcd66b96b57ec1a83", + "specs": [ + { + "group": "Battery", + "label": "Quantity", + "value": "1" + }, + { + "group": "Battery", + "label": "Card Type", + "value": "CFexpress Type B" + }, + { + "group": "Battery", + "label": "Storage Capacity", + "value": "512 GB" + }, + { + "group": "Battery", + "label": "Read Speed", + "value": "Maximum: 1700 MB/s" + }, + { + "group": "Battery", + "label": "Write Speed", + "value": "Maximum: 1400 MB/s" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.055 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.4 x 4.3 x 2.1\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1911631-REG/sandisk_512gb_extreme_pro_cfexpress.html", + "archive_url": "https://web.archive.org/web/20260212031443/https://www.bhphotovideo.com/c/product/1911631-REG/sandisk_512gb_extreme_pro_cfexpress.html", + "archive_timestamp": "20260212031443", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "sony-1920gb-cfexpress-4-0-type-a-tough-memory-card", + "name": "Sony 1920GB CFexpress 4.0 Type A TOUGH Memory Card", + "brand": "Sony", + "bh_sku": "SOCEAG1920T", + "mpn": "CEA-G1920T", + "department_slug": "photography", + "subcategory_slug": "memory-cards-storage", + "product_type": "Storage", + "price_usd": 1248.0, + "availability": "In Stock", + "condition": "New", + "description": "Designed for professional photographers, videographers, and enthusiasts looking to boost workflows with speed and reliability, the 1920GB CFexpress 4.0 Type A TOUGH Memory Card from Sony provides fast read speeds of up to 1800 MB/s and write speeds of up to 1700 MB/s. This quick performance benefits recording a variety of video resolutions, bit-rates, and compressions as well as high-resolution continuous raw photo shooting. Beyond its speed, this TOUGH memory card also has a reinforced physical design to withstand falls from up to 24' and has been rigidity tested to 150 N of force. It's also resistant to extreme temperatures, X-rays, electrostatic, and UV lighting. Offering further protection, File Rescue recovery software can be downloaded for recovering lost or even accidentally deleted files, while an IP57 rating provides resistance to dust and water, which offers greater reliability for outdoor use.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": 1920, + "image_path": "images/products/soceag1920t.jpg", + "image_sha256": "8b909995448ef60aecee440e7a77b268170486dc8cecdb35fca523aaab2b65b9", + "specs": [ + { + "group": "Specifications", + "label": "Quantity", + "value": "1" + }, + { + "group": "Specifications", + "label": "Card Type", + "value": "CFexpress Type A" + }, + { + "group": "Specifications", + "label": "Storage Capacity", + "value": "1920 GB" + }, + { + "group": "Specifications", + "label": "Bus Type", + "value": "PCI-Express 4.0" + }, + { + "group": "Specifications", + "label": "Read Speed", + "value": "Maximum: 1800 MB/s" + }, + { + "group": "Specifications", + "label": "Write Speed", + "value": "Maximum: 1700 MB/s | Minimum: 400 MB/s" + }, + { + "group": "Specifications", + "label": "Video Performance Guarantee", + "value": "VPG- 400" + }, + { + "group": "Specifications", + "label": "Operating Conditions", + "value": "10 to 161°F / -12 to 72°C" + }, + { + "group": "Specifications", + "label": "Storage Conditions", + "value": "-4 to 185°F / -20 to 85°C" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.08 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "4.6 x 4.5 x 0.7\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1906928-REG/sony_cea_g1920t_1920gb_cfexpress_4_0_type.html", + "archive_url": "https://web.archive.org/web/20260330193451/https://www.bhphotovideo.com/c/product/1906928-REG/sony_cea_g1920t_1920gb_cfexpress_4_0_type.html", + "archive_timestamp": "20260330193451", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "terramaster-d4-ssd-4-bay-m-2-usb4-enclosure", + "name": "TerraMaster D4 SSD 4-Bay M.2 USB4 Enclosure", + "brand": "TerraMaster", + "bh_sku": "TED4SSD", + "mpn": "D4 SSD", + "department_slug": "photography", + "subcategory_slug": "memory-cards-storage", + "product_type": "Storage", + "price_usd": 239.99, + "availability": "In Stock", + "condition": "New", + "description": "The D4 SSD 4-Bay M.2 USB4 Enclosure from TerraMaster is an expansive storage solution designed to assist in video production and content creation. Equipped with four PCIe NVMe M.2 2280 drive bays, the D4 SSD delivers data transfer up to 3257 MB/s and write speeds up to 3192 MB/s when configured in RAID 0. It connects to your Windows or macOS computer using a 40 Gb/s USB4 port that is compatible with Thunderbolt 3, 4, and 5 interfaces. Please note that the D4 SSD may not be configured as a RAID without the use of third-party software.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/ted4ssd.jpg", + "image_sha256": "2b5a6fb4388bded730764ef0e2431588e88ad6b63d9c4155bdcc6f36aff0b0e1", + "specs": [ + { + "group": "Key Specs", + "label": "RAID", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Number of Bays", + "value": "4x M.2 (2280) NVMe" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "1x USB-C (USB4)" + }, + { + "group": "Drives", + "label": "RAID", + "value": "No" + }, + { + "group": "Drives", + "label": "Transfer Rates", + "value": "3257 MB/s (Read) | 3192 MB/s (Write)" + }, + { + "group": "General", + "label": "Number of Bays", + "value": "4x M.2 (2280) NVMe" + }, + { + "group": "General", + "label": "Inputs/Outputs", + "value": "1x USB-C (USB4)" + }, + { + "group": "General", + "label": "Media Card Slots", + "value": "No" + }, + { + "group": "General", + "label": "PCI Expansion", + "value": "No" + }, + { + "group": "Software", + "label": "OS Compatibility", + "value": "macOS | Windows 11" + }, + { + "group": "Security", + "label": "Encryption", + "value": "No" + }, + { + "group": "Security", + "label": "Security Features", + "value": "No" + }, + { + "group": "Electrical", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "Electrical", + "label": "Power Consumption", + "value": "15 W (Maximum) | 6 W (Standby)" + }, + { + "group": "Physical", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C at 5 to 95% Humidity" + }, + { + "group": "Physical", + "label": "Storage Conditions", + "value": "-4 to 140°F / -20 to 60°C at 5 to 95% Humidity" + }, + { + "group": "Physical", + "label": "Certifications", + "value": "CCC, CE, FCC, KC, RoHS" + }, + { + "group": "Physical", + "label": "Cooling", + "value": "1x 50 mm Fan" + }, + { + "group": "Physical", + "label": "Noise Level", + "value": "19 dBA" + }, + { + "group": "Physical", + "label": "Cable Length", + "value": "2.6' / 0.8 m" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "5.5 x 5.4 x 2.4\" / 140 x 138 x 60 mm" + }, + { + "group": "Physical", + "label": "Weight", + "value": "0.9 lb / 392.0 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.21 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7.8 x 7.3 x 6.9\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1908990-REG/terramaster_d4_ssd_4_bay_m_2_usb4_40gbps.html", + "archive_url": "https://web.archive.org/web/20260418000924/https://www.bhphotovideo.com/c/product/1908990-REG/terramaster_d4_ssd_4_bay_m_2_usb4_40gbps.html", + "archive_timestamp": "20260418000924", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "terramaster-f4-ssd-4-bay-nas-enclosure", + "name": "TerraMaster F4 SSD 4-Bay NAS Enclosure", + "brand": "TerraMaster", + "bh_sku": "TEF4SSD", + "mpn": "F4 SSD", + "department_slug": "photography", + "subcategory_slug": "memory-cards-storage", + "product_type": "Storage", + "price_usd": 499.99, + "availability": "In Stock", + "condition": "New", + "description": "Purpose built for home users, the F4 SSD 4-Bay NAS Enclosure from TerraMaster offers users automatic photo backup, multi-user shared storage, local encryption, and more. It features four total M.2 2280 NVMe slots, with two of them supporting PCIe 3.0 x2 and the other two supporting PCIe 3.0 x1. Installed drives can be configured for RAID 0, 1, 5, 6, 10, JBOD, Single, or TRAID modes depending on your performance and security preferences. The F4 SSD seamlessly integrates into your network through its 5Gb Ethernet port, while other connections include 10 Gb/s USB-C, 10 Gb/s USB-A, and HDMI 2.0b. With integrated 4K hardware decoding at resolutions up to 4096 x 2160 at 60 fps, you can enjoy rich, detailed media on phones, computers, and multimedia centers. Your data is secured with hardware based encryption.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/tef4ssd.jpg", + "image_sha256": "2b5a6fb4388bded730764ef0e2431588e88ad6b63d9c4155bdcc6f36aff0b0e1", + "specs": [ + { + "group": "Key Specs", + "label": "RAID", + "value": "Yes: Supported RAID Modes: 0 / 1 / 5 / 6 / 10 / JBOD" + }, + { + "group": "Key Specs", + "label": "Number of Bays", + "value": "4x M.2 (2280) NVMe" + }, + { + "group": "Key Specs", + "label": "Inputs/Outputs", + "value": "1x RJ45 5GbE | 1x USB-C 3.1/3.2 Gen 2 | 2x USB-A 3.1/3.2 Gen 2 | 1x HDMI 2.0b" + }, + { + "group": "Computing", + "label": "CPU", + "value": "Quad-Core: Up to 3.4 GHz" + }, + { + "group": "Computing", + "label": "Processor", + "value": "Intel N95 (15 W TDP)" + }, + { + "group": "Computing", + "label": "GPU", + "value": "Intel UHD Graphics" + }, + { + "group": "Computing", + "label": "Memory", + "value": "8 GB DDR5" + }, + { + "group": "Computing", + "label": "RAM Configuration / Capacity", + "value": "1x User-Replaceable 8 GB Module / 4 Slots Supporting up to 32 GB (SO-DIMM)" + }, + { + "group": "Drives", + "label": "RAID", + "value": "Yes: Supported RAID Modes: 0 / 1 / 5 / 6 / 10 / JBOD" + }, + { + "group": "General", + "label": "Number of Bays", + "value": "4x M.2 (2280) NVMe" + }, + { + "group": "General", + "label": "Inputs/Outputs", + "value": "1x RJ45 5GbE | 1x USB-C 3.1/3.2 Gen 2 | 2x USB-A 3.1/3.2 Gen 2 | 1x HDMI 2.0b" + }, + { + "group": "General", + "label": "Media Card Slots", + "value": "No" + }, + { + "group": "General", + "label": "PCI Expansion", + "value": "No" + }, + { + "group": "Networking", + "label": "Link Aggregation and Failover Support", + "value": "No" + }, + { + "group": "Networking", + "label": "iSCSI Support", + "value": "Yes: 64 LUN / 64 Target" + }, + { + "group": "Software", + "label": "Installed Operating System", + "value": "No" + }, + { + "group": "Software", + "label": "OS Compatibility", + "value": "Windows | macOS | Linux" + }, + { + "group": "Software", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: TNAS" + }, + { + "group": "Security", + "label": "Encryption", + "value": "Yes" + }, + { + "group": "Security", + "label": "Security Features", + "value": "No" + }, + { + "group": "Electrical", + "label": "Input Power", + "value": "100 to 240 VAC, 50 / 60 Hz" + }, + { + "group": "Electrical", + "label": "Power Consumption", + "value": "32 W (Typical) | 8 W (Standby)" + }, + { + "group": "Electrical", + "label": "PSU", + "value": "1 x 48 W" + }, + { + "group": "Physical", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C at 5 to 95% Humidity" + }, + { + "group": "Physical", + "label": "Storage Conditions", + "value": "-5 to 140°F / -21 to 60°C at 5 to 95% Humidity" + }, + { + "group": "Physical", + "label": "Certifications", + "value": "CCC, CE, FCC, KC, RoHS, WEEE" + }, + { + "group": "Physical", + "label": "Cooling", + "value": "2x 50 mm Fans" + }, + { + "group": "Physical", + "label": "Noise Level", + "value": "19 dBA" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "5.5 x 5.4 x 2.4\" / 140 x 138 x 60 mm" + }, + { + "group": "Physical", + "label": "Weight", + "value": "1.3 lb / 0.6 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.615 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "8.3 x 7 x 6.8\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1908994-REG/terramaster_f4_ssd_4_core_16_gpu_4k.html", + "archive_url": "https://web.archive.org/web/20260815221421/https://www.bhphotovideo.com/c/product/1908994-REG/terramaster_f4_ssd_4_core_16_gpu_4k.html", + "archive_timestamp": "20260815221421", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "canon-eos-r1-mirrorless-camera-with-essentials-kit", + "name": "Canon EOS R1 Mirrorless Camera with Essentials+ Kit", + "brand": "Canon", + "bh_sku": "CAER1EK", + "mpn": null, + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 7143.73, + "availability": "In Stock", + "condition": "New", + "description": "Providing the high-quality essentials necessary to begin shooting with a compatible lens, the Canon EOS R1 Mirrorless Camera with Essentials+ Kit from B&H combines the full-frame mirrorless body with a protective camera bag, memory card, card reader, and spare Canon battery.", + "mount_type": "Canon RF", + "sensor_size": "Full-Frame", + "focal_length": null, + "connectivity": "Wi-Fi 6E (802.11ax) / Bluetooth 5.3", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Canon RF" + }, + { + "group": "Key Specs", + "label": "Effective Sensor Resolution", + "value": "24.2 Megapixel (6000 x 4000)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Sensor-Shift" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 102,400 (50 to 409,600 Extended)" + }, + { + "group": "Key Specs", + "label": "Internal Recording", + "value": "Raw 12-Bit | 6K at 24.00/25/29.97/50/59.94/23.98 fps | XF-HEVC S/XF-AVC S/MP4 4:2:2/4:2:0 8/10-Bit | Up to DCI 4K at 24.00/25/29.97/100/50/120/59.94/23.98 fps | |" + }, + { + "group": "Key Specs", + "label": "Video Output", + "value": "4:2:2 10-Bit via HDMI | Up to DCI 4K at 25/24.00/29.97/50/59.94/23.98 fps" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Dual Slot: CFexpress Type B (CFexpress 2.0) [VPG-400 or Faster Recommended]" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x RJ45 Data Output | 1x USB-C (USB 3.2 / 3.1 Gen 2) Data/Remote Input/Output (Shared with Power Input)" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Wi-Fi 6E (802.11ax) / Bluetooth 5.3" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Articulating 3.2\" Touchscreen LCD | Status Display (Top): LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x LP-E19 Rechargeable Lithium-Ion, 10.8 VDC, 2750 mAh (Included)" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Canon RF" + }, + { + "group": "Imaging", + "label": "Effective Sensor Resolution", + "value": "Effective: 24.2 Megapixel (6000 x 4000) | Actual: 26.7 Megapixel" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "36 x 24 mm (Full-Frame) BSI Stacked CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1x | *Additional Crop Occurs in Select Video Modes" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Sensor-Shift, 5-Axis" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Mechanical Focal Plane Shutter and Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Shutter | 1/64000 to 30 Seconds | 1/16000 to 30 Seconds in Manual Mode | 1/16000 to 30 Seconds in Shutter Priority Mode | Electronic Front Curtain Shutter | 1/8000 to 30 Seconds | Mechanical Shutter | 1/8000 to 30 Seconds" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb Mode" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 102,400 (50 to 409,600 Extended)" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Evaluative, Partial, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-3 to +3 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "-3 to 20 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Presets: Auto, Cloudy, Color Temperature, Custom, Daylight, Flash, Fluorescent (White), Shade, Tungsten" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 40 fps at Maximum Resolution" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/10-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "3:2" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "HEIF, JPEG, Raw" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "Raw 12-Bit | 6000 x 3164 at 24.00/25/29.97/50/59.94/23.98 fps | XF-HEVC S/XF-AVC S/MP4 4:2:2/4:2:0 8/10-Bit | 4096 x 2160 at 24.00/25/29.97/100/50/120/59.94/23.98 fps | 3840 x 2160 at 100/23.98/120/50/25/29.97/59.94 fps | 2048 x 1080 at 200/100/23.98/240/120/50/24.00/25/29.97/59.94 fps | 1920 x 1080 at 200/100/23.98/240/120/50/25/29.97/59.94 fps" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "4:2:2 10-Bit via HDMI | 4096 x 2160 at 25/24.00/29.97/50/59.94/23.98 fps | 3840 x 2160 at 59.94/23.98/25/29.97/50 fps" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Slow-Motion Only" + }, + { + "group": "Video Capture", + "label": "Gamma Curve", + "value": "Canon Log 2, Canon Log 3, HDR-HLG, HDR-PQ, Rec709, Rec2020" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "No" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "Raw: 4-Channel 24-Bit LPCM Audio | 2-Channel 16-Bit AAC Audio" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Dual Slot: CFexpress Type B (CFexpress 2.0) [VPG-400 or Faster Recommended]" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x RJ45 Data Output | 1x USB-C (USB 3.2 / 3.1 Gen 2) Data/Remote Input/Output (Shared with Power Input)" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "Wi-Fi 6E (802.11ax) / Bluetooth 5.3" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: Canon Camera Connect | Functionality: Access Stored Files, Adjust Settings, Firmware Update, Remote Control, View Live Feed" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Articulating 3.2\" Touchscreen LCD | Status Display (Top): LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "2,100,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Electronic (OLED)" + }, + { + "group": "Viewfinder", + "label": "Size", + "value": "0.5\"" + }, + { + "group": "Viewfinder", + "label": "Resolution", + "value": "9,440,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Eye Point", + "value": "25 mm" + }, + { + "group": "Viewfinder", + "label": "Coverage", + "value": "100%" + }, + { + "group": "Viewfinder", + "label": "Magnification", + "value": "Approx. 0.9x" + }, + { + "group": "Viewfinder", + "label": "Diopter Adjustment", + "value": "-4 to +2" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Continuous-Servo AF, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Photo | Phase Detection: 4897 | Video | Phase Detection: 4067" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-7.5 to +21 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "No" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "1/320 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-3 to +3 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "eTTL" + }, + { + "group": "Flash", + "label": "External Flash Connection", + "value": "Shoe Mount" + }, + { + "group": "General", + "label": "Battery", + "value": "1x LP-E19 Rechargeable Lithium-Ion, 10.8 VDC, 2750 mAh (Included)" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Materials", + "value": "Magnesium Alloy" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 113°F / 0 to 45°C up to 85% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "6.2 x 5.9 x 3.4\" / 157.6 x 149.5 x 87.3 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "2.0 lb / 920 g (Body Only) | 2.5 lb / 1115 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "5.275 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "11.5 x 9.1 x 7.4\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1906623-REG/canon_eos_r1_mirrorless_camera.html", + "archive_url": "https://web.archive.org/web/20260110065357/https://www.bhphotovideo.com/c/product/1906623-REG/canon_eos_r1_mirrorless_camera.html", + "archive_timestamp": "20260110065357", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "canon-eos-r100-mirrorless-camera-with-18-45mm-lens-and-essentials-kit", + "name": "Canon EOS R100 Mirrorless Camera with 18-45mm Lens and Essentials+ Kit", + "brand": "Canon", + "bh_sku": "CAER1001845E", + "mpn": null, + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 626.4, + "availability": "In Stock", + "condition": "New", + "description": "Comprising the high-quality essentials needed to begin shooting, the Canon EOS R100 Mirrorless Camera with 18-45mm Lens and Essentials+ Kit from B&H combines the APS-C mirrorless body with a standard zoom, a protective camera bag, a memory card, and Canon spare battery.", + "mount_type": "Canon RF", + "sensor_size": "APS-C", + "focal_length": null, + "connectivity": "802.11b/g Wi-Fi / Bluetooth 4.2", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Canon RF" + }, + { + "group": "Key Specs", + "label": "Effective Sensor Resolution", + "value": "24.1 Megapixel (6000 x 4000)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "APS-C" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 12,800 (100 to 25,600 Extended)" + }, + { + "group": "Key Specs", + "label": "Internal Recording", + "value": "H.264/MPEG-4 AVC 8-Bit | Up to UHD 4K at 23.98 fps | | |" + }, + { + "group": "Key Specs", + "label": "Video Output", + "value": "HDMI | 1080p" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x USB-C (USB 2.0) Data Output" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "802.11b/g Wi-Fi / Bluetooth 4.2" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Fixed 3\" LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x LP-E17 Rechargeable (Included)" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Canon RF" + }, + { + "group": "Imaging", + "label": "Effective Sensor Resolution", + "value": "Effective: 24.1 Megapixel (6000 x 4000) | Actual: 25.8 Megapixel" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "22.3 x 14.9 mm (APS-C) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1.6x" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Shutter | 1/4000 to 1 Second in Manual Mode" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb Mode (1/4000 to 30 Seconds)" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 12,800 (100 to 25,600 Extended)" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Evaluative, Partial, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-3 to +3 EV (1/3 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "-2 to 20 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Presets: Auto, Cloudy, Color Temperature, Custom, Daylight, Flash, Fluorescent (White), Shade, Tungsten" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 6.5 fps at Maximum Resolution for up to 6 Frames (Raw) / 100 Frames (JPEG)" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/10-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 3:2, 4:3, 16:9" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "C-RAW, JPEG, Raw" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "H.264/MPEG-4 AVC 8-Bit | 3840 x 2160 at 23.98 fps (120 Mb/s) | 1920 x 1080 at 59.94 fps (60 Mb/s) | 1920 x 1080 at 23.98/29.97 fps (30 Mb/s) | 1920 x 1080 at 120 fps (52 Mb/s) | 1280 x 720 at 59.94 fps (26 Mb/s)" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "HDMI | 1920 x 1080" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Slow-Motion Only" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "30-Minute Maximum | 8-Minute Maximum in 1080p HFR" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "No" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x USB-C (USB 2.0) Data Output" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "802.11b/g Wi-Fi / Bluetooth 4.2" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: Canon Camera Connect | Functionality: Access Stored Files, Adjust Settings, Firmware Update, Remote Control, View Live Feed" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Fixed 3\" LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "1,040,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Electronic (OLED)" + }, + { + "group": "Viewfinder", + "label": "Size", + "value": "0.39\"" + }, + { + "group": "Viewfinder", + "label": "Resolution", + "value": "2,360,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Eye Point", + "value": "22 mm" + }, + { + "group": "Viewfinder", + "label": "Coverage", + "value": "100%" + }, + { + "group": "Viewfinder", + "label": "Magnification", + "value": "Approx. 0.95x" + }, + { + "group": "Viewfinder", + "label": "Diopter Adjustment", + "value": "-3 to +1" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Continuous-Servo AF, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Photo | Phase Detection: 3975 | Video | Phase Detection: 3375" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-4 to +20 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "Yes, Flash Only" + }, + { + "group": "Flash", + "label": "Flash Modes", + "value": "TTL Auto" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "250 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-2 to +2 EV (1/3 EV Steps)" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "eTTL" + }, + { + "group": "Flash", + "label": "External Flash Connection", + "value": "Shoe Mount" + }, + { + "group": "General", + "label": "Battery", + "value": "1x LP-E17 Rechargeable (Included)" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C up to 85% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "4.6 x 3.4 x 2.7\" / 116.3 x 85.5 x 68.8 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "10.9 oz / 309 g (Body Only) | 12.6 oz / 356 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.62 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "8.1 x 7.9 x 6.2\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1907106-REG/canon_eos_r100_mirrorless_camera.html", + "archive_url": "https://web.archive.org/web/20260131073438/https://www.bhphotovideo.com/c/product/1907106-REG/canon_eos_r100_mirrorless_camera.html", + "archive_timestamp": "20260131073438", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "canon-eos-r100-mirrorless-camera-with-18-45mm-and-50mm-lenses-kit", + "name": "Canon EOS R100 Mirrorless Camera with 18-45mm and 50mm Lenses Kit", + "brand": "Canon", + "bh_sku": "CAER1001845K", + "mpn": null, + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 768.0, + "availability": "In Stock", + "condition": "New", + "description": "Ideal for modern-day multimedia workflows, this Canon EOS R100 Mirrorless Camera with 18-45mm and 50mm Lenses Kit, assembled by B&H, bundles the sleek mirrorless camera body with the RF-S 18-45mm f/4.5-6.3 IS STM standard zoom lens and the compact RF 50mm f/1.8 STM standard prime lens.", + "mount_type": "Canon RF", + "sensor_size": "APS-C", + "focal_length": null, + "connectivity": "802.11b/g Wi-Fi / Bluetooth 4.2", + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/caer1001845k.jpg", + "image_sha256": "46710628e1422feedc97de49d30a8b8b3bdf53df5d073b2aef9c3aed57580aab", + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Canon RF" + }, + { + "group": "Key Specs", + "label": "Effective Sensor Resolution", + "value": "24.1 Megapixel (6000 x 4000)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "APS-C" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 12,800 (100 to 25,600 Extended)" + }, + { + "group": "Key Specs", + "label": "Max Recording Modes", + "value": "H.264/MPEG-4 AVC 8-Bit | Up to UHD 4K at 23.98 fps" + }, + { + "group": "Key Specs", + "label": "Max Video Output", + "value": "1080p" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x USB-C (USB 2.0) Data Output" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "802.11b/g Wi-Fi / Bluetooth 4.2" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Fixed 3\" LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x LP-E17 Rechargeable (Included)" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Canon RF" + }, + { + "group": "Imaging", + "label": "Effective Sensor Resolution", + "value": "Effective: 24.1 Megapixel (6000 x 4000) | Actual: 25.8 Megapixel" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "22.3 x 14.9 mm (APS-C) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1.6x" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Shutter | 1/4000 to 1 Second in Manual Mode" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb Mode (1/4000 to 30 Seconds)" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 12,800 (100 to 25,600 Extended)" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Evaluative, Partial, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-3 to +3 EV (1/3 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "-2 to 20 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Presets: Auto, Cloudy, Color Temperature, Custom, Daylight, Flash, Fluorescent (White), Shade, Tungsten" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 6.5 fps at Maximum Resolution for up to 6 Frames (Raw) / 100 Frames (JPEG)" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/10-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 3:2, 4:3, 16:9" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "C-RAW, JPEG, Raw" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "H.264/MPEG-4 AVC 8-Bit | 3840 x 2160 at 23.98 fps (120 Mb/s) | 1920 x 1080 at 59.94 fps (60 Mb/s) | 1920 x 1080 at 23.98/29.97 fps (30 Mb/s) | 1920 x 1080 at 120 fps (52 Mb/s) | 1280 x 720 at 59.94 fps (26 Mb/s)" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "1920 x 1080" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Slow-Motion Only" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "30-Minute Maximum | 8-Minute Maximum in 1080p HFR" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "No" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x USB-C (USB 2.0) Data Output" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "802.11b/g Wi-Fi / Bluetooth 4.2" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: Canon Camera Connect | Functionality: Access Stored Files, Adjust Settings, Firmware Update, Remote Control, View Live Feed" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Fixed 3\" LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "1,040,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Electronic (OLED)" + }, + { + "group": "Viewfinder", + "label": "Size", + "value": "0.39\"" + }, + { + "group": "Viewfinder", + "label": "Resolution", + "value": "2,360,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Eye Point", + "value": "22 mm" + }, + { + "group": "Viewfinder", + "label": "Coverage", + "value": "100%" + }, + { + "group": "Viewfinder", + "label": "Magnification", + "value": "Approx. 0.95x" + }, + { + "group": "Viewfinder", + "label": "Diopter Adjustment", + "value": "-3 to +1" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Continuous-Servo AF, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Photo | Phase Detection: 3975 | Video | Phase Detection: 3375" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-4 to +20 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "Yes, Flash Only" + }, + { + "group": "Flash", + "label": "Flash Modes", + "value": "TTL Auto" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "250 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-2 to +2 EV (1/3 EV Steps)" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "eTTL" + }, + { + "group": "Flash", + "label": "External Flash Connection", + "value": "Shoe Mount" + }, + { + "group": "General", + "label": "Battery", + "value": "1x LP-E17 Rechargeable (Included)" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C up to 85% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "4.6 x 3.4 x 2.7\" / 116.3 x 85.5 x 68.8 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "10.9 oz / 309 g (Body Only) | 12.6 oz / 356 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.62 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "8.1 x 7.9 x 6.2\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1912148-REG/canon_eos_r100_mirrorless_camera.html", + "archive_url": "https://web.archive.org/web/20260213102945/https://www.bhphotovideo.com/c/product/1912148-REG/canon_eos_r100_mirrorless_camera.html", + "archive_timestamp": "20260213102945", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "canon-eos-r100-mirrorless-camera-with-18-45mm-and-75-300mm-lenses", + "name": "Canon EOS R100 Mirrorless Camera with 18-45mm and 75-300mm Lenses", + "brand": "Canon", + "bh_sku": "CAER1002DZLK", + "mpn": "6052C111", + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 749.0, + "availability": "In Stock", + "condition": "New", + "description": "A sleek mirrorless camera bundle for photographers, videographers, and content creators, the compact and highly-portable Canon EOS R100 Mirrorless Camera with 18-45mm and 75-300mm Lenses is well-suited for modern-day multimedia workflows.", + "mount_type": "Canon RF", + "sensor_size": "APS-C", + "focal_length": null, + "connectivity": "802.11b/g Wi-Fi / Bluetooth 4.2", + "megapixels": 24.1, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Canon RF" + }, + { + "group": "Key Specs", + "label": "Effective Sensor Resolution", + "value": "24.1 Megapixel (6000 x 4000)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "APS-C" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 12,800 (100 to 25,600 Extended)" + }, + { + "group": "Key Specs", + "label": "Max Recording Modes", + "value": "H.264/MPEG-4 AVC 8-Bit | Up to UHD 4K at 23.98 fps" + }, + { + "group": "Key Specs", + "label": "Max Video Output", + "value": "1080p" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x USB-C 2.0 (Data) Output" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "802.11b/g Wi-Fi / Bluetooth 4.2" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Fixed 3\" LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x LP-E17 Rechargeable (Included)" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Canon RF" + }, + { + "group": "Imaging", + "label": "Sensor Resolution", + "value": "Effective: 24.1 Megapixel (6000 x 4000) | Actual: 25.8 Megapixel" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "22.3 x 14.9 mm (APS-C) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1.6x" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Shutter | 1/4000 to 1 Second in Manual Mode" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb Mode (1/4000 to 30 Seconds)" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 12,800 (100 to 25,600 Extended)" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Evaluative, Partial, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-3 to +3 EV (1/3 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "-2 to 20 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Presets: Auto, Cloudy, Color Temperature, Custom, Daylight, Flash, Fluorescent (White), Shade, Tungsten" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 6.5 fps at Maximum Resolution for up to 6 Frames (Raw) / 100 Frames (JPEG)" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/10-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 3:2, 4:3, 16:9" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "C-RAW, JPEG, Raw" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "H.264/MPEG-4 AVC 8-Bit | 3840 x 2160 at 23.98 fps (120 Mb/s) | 1920 x 1080 at 59.94 fps (60 Mb/s) | 1920 x 1080 at 23.98/29.97 fps (30 Mb/s) | 1920 x 1080 at 120 fps (52 Mb/s) | 1280 x 720 at 59.94 fps (26 Mb/s)" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "| 1920 x 1080" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Slow-Motion Only" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "30-Minute Maximum | 8-Minute Maximum in 1080p HFR" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "No" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x USB-C 2.0 (Data) Output" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "802.11b/g Wi-Fi / Bluetooth 4.2" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: Canon Camera Connect | Functionality: Access Stored Files, Adjust Settings, Firmware Update, Remote Control, View Live Feed" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Fixed 3\" LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "1,040,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Electronic (OLED)" + }, + { + "group": "Viewfinder", + "label": "Size", + "value": "0.39\"" + }, + { + "group": "Viewfinder", + "label": "Resolution", + "value": "2,360,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Eye Point", + "value": "22 mm" + }, + { + "group": "Viewfinder", + "label": "Coverage", + "value": "100%" + }, + { + "group": "Viewfinder", + "label": "Magnification", + "value": "Approx. 0.95x" + }, + { + "group": "Viewfinder", + "label": "Diopter Adjustment", + "value": "-3 to +1" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Continuous-Servo AF, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Photo | Phase Detection: 3975 | Video | Phase Detection: 3375" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-4 to +20 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "Yes, Flash Only" + }, + { + "group": "Flash", + "label": "Flash Modes", + "value": "TTL Auto" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "250 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-2 to +2 EV (1/3 EV Steps)" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "eTTL" + }, + { + "group": "Flash", + "label": "Shoe Mount", + "value": "1x Hot Shoe" + }, + { + "group": "Flash", + "label": "Non-Shoe Flash Connection", + "value": "No" + }, + { + "group": "General", + "label": "Battery", + "value": "1x LP-E17 Rechargeable (Included)" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C up to 85% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "4.6 x 3.4 x 2.7\" / 116.3 x 85.5 x 68.8 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "11 oz / 309 g (Body Only) | 13 oz / 356 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.62 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "8.1 x 7.9 x 6.2\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1906622-REG/canon_6052c111_eos_r100_mirrorless_camera.html", + "archive_url": "https://web.archive.org/web/20260814033037/https://www.bhphotovideo.com/c/product/1906622-REG/canon_6052c111_eos_r100_mirrorless_camera.html", + "archive_timestamp": "20260814033037", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "canon-eos-r50-mirrorless-camera-with-18-45mm-and-50mm-lenses-kit-white", + "name": "Canon EOS R50 Mirrorless Camera with 18-45mm and 50mm Lenses Kit (White)", + "brand": "Canon", + "bh_sku": "CAER501850WK", + "mpn": null, + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 1018.0, + "availability": "In Stock", + "condition": "New", + "description": "Assembled by B&H, the Canon EOS R50 Mirrorless Camera with 18-45mm and 50mm Lenses Kit bundles the versatile camera body with the RF-S 18-45mm f/4.5-6.3 IS STM standard zoom lens and the compact RF 50mm f/1.8 STM standard prime lens.", + "mount_type": "Canon RF", + "sensor_size": "APS-C", + "focal_length": "18 to 45mm (35mm Equivalent: 29 to 72mm)", + "connectivity": "Wi-Fi 4 (802.11n) / Bluetooth 4.2", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Canon RF" + }, + { + "group": "Key Specs", + "label": "Effective Sensor Resolution", + "value": "24.2 Megapixel (6000 x 4000)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "APS-C" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Digital" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 32,000 (100 to 51,200 Extended)" + }, + { + "group": "Key Specs", + "label": "Internal Recording", + "value": "H.264/H.265/MPEG-4 | Up to UHD 4K at 25/29.97/23.98 fps" + }, + { + "group": "Key Specs", + "label": "Video Output", + "value": "HDMI | Up to UHD 4K" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x USB-C Data Output (Shared with Power Input)" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Wi-Fi 4 (802.11n) / Bluetooth 4.2" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Articulating 3\" Touchscreen LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x LP-E17 Rechargeable, 7.2 VDC, 1040 mAh (Included)" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Canon RF" + }, + { + "group": "Imaging", + "label": "Effective Sensor Resolution", + "value": "Effective: 24.2 Megapixel (6000 x 4000) | Actual: 25.5 Megapixel" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "22.3 x 14.9 mm (APS-C) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1.6x | *Additional Crop Occurs in Select Video Modes" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Digital (Video Only)" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Shutter | 1/8000 to 30 Seconds | Electronic Front Curtain Shutter | 1/4000 to 30 Seconds" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb & Time Mode" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 32,000 (100 to 51,200 Extended)" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Evaluative, Partial, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-3 to +3 EV (1/3 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "-2 to 20 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Presets: Auto, Cloudy, Color Temperature, Custom, Daylight, Flash, Fluorescent (White), Shade, Tungsten" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 15 fps at Maximum Resolution for up to 7 Frames (Raw) / 28 Frames (JPEG)" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/10-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 3:2, 4:3, 16:9" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "C-RAW, HEIF, JPEG, Raw" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "H.264/H.265/MPEG-4 | 3840 x 2160 at 25/29.97/23.98 fps | 1920 x 1080 at 100/23.98/120/50/25/29.97/59.94 fps" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "HDMI | 3840 x 2160 | 1920 x 1080" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Slow-Motion Only" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "Not Specified by Manufacturer" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "Yes" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x USB-C Data Output (Shared with Power Input)" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "Wi-Fi 4 (802.11n) / Bluetooth 4.2" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: Canon Camera Connect | Functionality: Access Stored Files, Adjust Settings, Firmware Update, Remote Control, View Live Feed" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Articulating 3\" Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "1,620,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Electronic" + }, + { + "group": "Viewfinder", + "label": "Size", + "value": "0.39\"" + }, + { + "group": "Viewfinder", + "label": "Resolution", + "value": "2,360,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Eye Point", + "value": "22 mm" + }, + { + "group": "Viewfinder", + "label": "Coverage", + "value": "100%" + }, + { + "group": "Viewfinder", + "label": "Magnification", + "value": "Approx. 96x" + }, + { + "group": "Viewfinder", + "label": "Diopter Adjustment", + "value": "-3 to +1" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Continuous-Servo AF, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Photo | Phase Detection: 4503 | Video | 3713" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-4 to +20 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "Yes, Flash Only" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "1/250 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-3 to +3 EV (1/3 EV Steps)" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "eTTL" + }, + { + "group": "Flash", + "label": "External Flash Connection", + "value": "Shoe Mount" + }, + { + "group": "General", + "label": "Battery", + "value": "1x LP-E17 Rechargeable, 7.2 VDC, 1040 mAh (Included)" + }, + { + "group": "General", + "label": "PoE Support", + "value": "Yes" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Intelligent Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C up to 85% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "4.6 x 3.4 x 2.7\" / 116.8 x 86.4 x 68.6 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "11.6 oz / 328 g (Body Only) | 13.2 oz / 375 g (With Battery, Recording Media)" + }, + { + "group": "Kit Lens", + "label": "Focal Length", + "value": "18 to 45mm (35mm Equivalent: 29 to 72mm)" + }, + { + "group": "Kit Lens", + "label": "Aperture", + "value": "Maximum: f/4.5 to 6.3 | Minimum: f/32" + }, + { + "group": "Kit Lens", + "label": "Angle of View", + "value": "74° 20' to 33° 40'" + }, + { + "group": "Kit Lens", + "label": "Magnification", + "value": "1:6.25 Macro Reproduction Ratio | 0.16x Magnification" + }, + { + "group": "Kit Lens", + "label": "Minimum Focus Distance", + "value": "7.9\" / 20 cm" + }, + { + "group": "Kit Lens", + "label": "Optical Design", + "value": "7 Elements in 7 Groups" + }, + { + "group": "Kit Lens", + "label": "Aperture/Iris Blades", + "value": "7, Rounded" + }, + { + "group": "Kit Lens", + "label": "Focus Type", + "value": "Autofocus" + }, + { + "group": "Kit Lens", + "label": "Image Stabilization", + "value": "Yes" + }, + { + "group": "Kit Lens", + "label": "Filter Size", + "value": "49 mm (Front)" + }, + { + "group": "Kit Lens", + "label": "Dimensions", + "value": "ø: 2.7 x L: 1.7\" / ø: 68.9 x L: 44.3 mm" + }, + { + "group": "Kit Lens", + "label": "Weight", + "value": "4.6 oz / 130 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.14 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "8 x 6.8 x 5.6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1912150-REG/canon_canon_eos_r50_mirrorless.html", + "archive_url": "https://web.archive.org/web/20260203215137/https://www.bhphotovideo.com/c/product/1912150-REG/canon_canon_eos_r50_mirrorless.html", + "archive_timestamp": "20260203215137", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "fujifilm-x-t30-iii-mirrorless-camera-black", + "name": "FUJIFILM X-T30 III Mirrorless Camera (Black)", + "brand": "FUJIFILM", + "bh_sku": "FUXT303CB", + "mpn": "16957841", + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 999.0, + "availability": "In Stock", + "condition": "New", + "description": "Expand the creative possibilities of on-the-go image capture with the X-T30 III from FUJIFILM, an analog-inspired mirrorless camera that packs cutting-edge photo and video technology into a stylish, portable form factor. With its centrally located electronic viewfinder and multitude of physical dials, the X-T30 supplies a traditional SLR-style shooting experience, along with the optional convenience of a single-switch fully automatic mode. This operational flexibility allows visual storytellers to focus on their subjects without sacrificing image quality, while FUJIFILM's built-in film emulation, user-customizable recipes, and extensive X-mount ecosystem ensure endless potential for artistic expression.", + "mount_type": "FUJIFILM X", + "sensor_size": "23.5 x 15.6 mm (APS-C) CMOS", + "focal_length": null, + "connectivity": null, + "megapixels": 26.1, + "capacity_gb": null, + "image_path": "images/products/fuxt303cb.jpg", + "image_sha256": "c2edda818932fd8644371f98ac5c46d699db3e7073ba4ddbc00aff1e915e83f1", + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "FUJIFILM X" + }, + { + "group": "Key Specs", + "label": "Sensor Resolution", + "value": "Effective: 26.1 Megapixel" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "23.5 x 15.6 mm (APS-C) CMOS" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Digital" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Photo/Video | Native: 160 to 12,800 (80 to 51,200 Extended)" + }, + { + "group": "Key Specs", + "label": "Internal Recording", + "value": "H.264 Long GOP/H.265 Long GOP/MPEG-4 AVC | 6240 x 4160 at 23.98/24.00/25/29.97 fps [8 to 200 Mb/s] | DCI 4K (4096 x 2160) at 23.98/24.00/25/29.97/50/59.94 fps [8 to 200 Mb/s] | UHD 4K (3840 x 2160) at 23.98/24.00/25/29.97/50/59.94 fps [8 to 200 Mb/s] | 1080 x 1920 at 23.98/24.00/25/29.97 fps [8 to 200 Mb/s] | 2048 x 1080 at 23.98/24.00/25/29.97/50/59.94 fps [8 to 200 Mb/s] | 2048 x 1080 at 100/120/200/240 fps [200 Mb/s] | 1920 x 1080 at 23.98/24.00/25/29.97/50/59.94/100/120/200/240 fps [8 to 200 Mb/s]" + }, + { + "group": "Key Specs", + "label": "Video Output", + "value": "10-Bit via Micro-HDMI | 6240 x 4160 at 23.98/24.00/25/29.97 fps | DCI 4K (4096 x 2160) at 23.98/24.00/25/29.97/50/59.94 fps | UHD 4K (3840 x 2160) at 23.98/24.00/25/29.97/50/59.94 fps | 1080 x 1920 at 23.98/24.00/25/29.97/50/59.94 fps | DCI 2K (2048 x 1080) at 23.98/24.00/25/29.97/50/59.94/100/120/200/240 fps | HD (1920 x 1080) at 23.98/24.00/25/29.97/50/59.94/100/120/200/240 fps | 12-Bit via Micro-HDMI | 6240 x 4160 at 23.98/24.00/25/29.97 fps | 5232 x 2944 at 23.98/24.00/25/29.97/50/59.94 fps" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-I) [2 TB Maximum]" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 2.5 mm Sub-Mini TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x 2.5 mm Sub-Mini Remote Input (Shared with Audio Input) | 1x USB-C Data Output (Shared with Power Input)" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Tilting 3\" Touchscreen LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x NP-W126S Rechargeable Lithium-Ion, 8.4 VDC, 1260 mAh (Included) |  • Approx. 315 Shots" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "FUJIFILM X" + }, + { + "group": "Imaging", + "label": "Sensor Resolution", + "value": "Effective: 26.1 Megapixel" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "23.5 x 15.6 mm (APS-C) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1.5x | *Additional Crop Occurs in Select Video Modes" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Digital" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Mechanical Focal Plane Shutter and Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Shutter | 1/32000 to 15 Minutes in Manual Mode | 1/32000 to 30 Seconds in Aperture Priority Mode | 1/32000 to 15 Minutes in Shutter Priority Mode | 1/32000 to 30 Seconds in Program Mode | Electronic Front Curtain Shutter | 1/4000 to 15 Minutes in Manual Mode | 1/4000 to 30 Seconds in Aperture Priority Mode | 1/4000 to 15 Minutes in Shutter Priority Mode | 1/4000 to 30 Seconds in Program Mode | Mechanical Shutter | 1/4000 to 15 Minutes in Manual Mode | 1/4000 to 30 Seconds in Aperture Priority Mode | 1/4000 to 15 Minutes in Shutter Priority Mode | 1/4000 to 30 Seconds in Program Mode" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb Mode (Up to 1 Hour)" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Photo/Video | Native: 160 to 12,800 (80 to 51,200 Extended)" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Average, Center-Weighted Average, Multi, Spot, TTL 256-Zones" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-5 to +5 EV (1/3 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "2500 to 10,000K | Presets: AWB, Auto, Color Temperature, Custom, Custom 1, Custom 2, Daylight, Fine, Fluorescent (Cool White), Fluorescent (Daylight), Fluorescent (Warm White), Incandescent, Shade, Underwater" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 20 fps at Maximum Resolution for up to 23 Frames (Raw) / 127 Frames (JPEG)" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/10-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 3:2, 16:9" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "HEIF, JPEG, Raw, TIFF" + }, + { + "group": "Still Image Capture", + "label": "Bit Depth", + "value": "14-Bit" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "H.264 Long GOP/H.265 Long GOP/MPEG-4 AVC | 6240 x 4160 at 23.98/24.00/25/29.97 fps [8 to 200 Mb/s] | DCI 4K (4096 x 2160) at 23.98/24.00/25/29.97/50/59.94 fps [8 to 200 Mb/s] | UHD 4K (3840 x 2160) at 23.98/24.00/25/29.97/50/59.94 fps [8 to 200 Mb/s] | 1080 x 1920 at 23.98/24.00/25/29.97 fps [8 to 200 Mb/s] | 2048 x 1080 at 23.98/24.00/25/29.97/50/59.94 fps [8 to 200 Mb/s] | 2048 x 1080 at 100/120/200/240 fps [200 Mb/s] | 1920 x 1080 at 23.98/24.00/25/29.97/50/59.94/100/120/200/240 fps [8 to 200 Mb/s]" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "10-Bit via Micro-HDMI | 6240 x 4160 at 23.98/24.00/25/29.97 fps | DCI 4K (4096 x 2160) at 23.98/24.00/25/29.97/50/59.94 fps | UHD 4K (3840 x 2160) at 23.98/24.00/25/29.97/50/59.94 fps | 1080 x 1920 at 23.98/24.00/25/29.97/50/59.94 fps | DCI 2K (2048 x 1080) at 23.98/24.00/25/29.97/50/59.94/100/120/200/240 fps | HD (1920 x 1080) at 23.98/24.00/25/29.97/50/59.94/100/120/200/240 fps | 12-Bit via Micro-HDMI | 6240 x 4160 at 23.98/24.00/25/29.97 fps | 5232 x 2944 at 23.98/24.00/25/29.97/50/59.94 fps" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Slow-Motion Only" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "No" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "2-Channel 24-Bit 48 kHz LPCM Audio | MP4: AAC Audio" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-I) [2 TB Maximum]" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 2.5 mm Sub-Mini TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x 2.5 mm Sub-Mini Remote Input (Shared with Audio Input) | 1x USB-C Data Output (Shared with Power Input)" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: FUJIFILM XApp | Functionality: Access Stored Files, Adjust Settings, Firmware Update, Remote Control, Setup, View Live Feed" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Tilting 3\" Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "1,620,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Electronic (OLED)" + }, + { + "group": "Viewfinder", + "label": "Size", + "value": "0.39\"" + }, + { + "group": "Viewfinder", + "label": "Resolution", + "value": "2,360,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Eye Point", + "value": "17.5 mm" + }, + { + "group": "Viewfinder", + "label": "Coverage", + "value": "100%" + }, + { + "group": "Viewfinder", + "label": "Magnification", + "value": "Approx. 0.62x" + }, + { + "group": "Viewfinder", + "label": "Diopter Adjustment", + "value": "-4 to +2" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Automatic, Continuous-Servo AF, Manual Focus, Single-Servo AF, Subject Tracking (Auto-Tracking/Animals/Birds/Eyes/People/Vehicles)" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Photo, Video | Phase Detection: 425" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "Yes, Flash Only" + }, + { + "group": "Flash", + "label": "Flash Modes", + "value": "Auto, Commander, Manual, Slow Sync, TTL Auto" + }, + { + "group": "Flash", + "label": "Guide Number", + "value": "23' / 7 m at ISO 200 | 16.4' / 5 m at ISO 100" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "1/180 Second" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "TTL" + }, + { + "group": "Flash", + "label": "External Flash Connection", + "value": "Shoe Mount" + }, + { + "group": "General", + "label": "Battery", + "value": "1x NP-W126S Rechargeable Lithium-Ion, 8.4 VDC, 1260 mAh (Included) |  • Approx. 315 Shots" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C at 10 to 80% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "4.7 x 3.3 x 1.8\" / 118.4 x 82.8 x 46.8 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "11.6 oz / 329 g (Body Only) | 13.3 oz / 378 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.405 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.9 x 6.4 x 4.4\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1926406-REG/fujifilm_16957841_x_t30_iii_mirrorless_camera.html", + "archive_url": "https://web.archive.org/web/20251207182857/https://www.bhphotovideo.com/c/product/1926406-REG/fujifilm_16957841_x_t30_iii_mirrorless_camera.html", + "archive_timestamp": "20251207182857", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "meike-mk-rf-af1-13mm-and-18mm-extension-tubes-for-canon-rf", + "name": "Meike MK-RF-AF1 13mm and 18mm Extension Tubes for Canon RF", + "brand": "Meike", + "bh_sku": "MEMKRFAF1", + "mpn": "MK-RF-AF1", + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 39.99, + "availability": "In Stock", + "condition": "New", + "description": "Helping to achieve a shorter minimum focusing distance with Canon RF-mount lenses, these MK-RF-AF1 Extension Tubes from Meike also afford a greater maximum magnification for close-up shooting with any lens. This kit includes 13mm and 18mm tubes, which can be used independently or in combination for up to three different lengths to suit different subject types and desired working distances. As automatic tubes, integrated copper contacts maintain full autofocus and auto-exposure functionality for seamless use. Additionally, the tubes incorporate aluminum alloy bayonet mounts for a rigid and durable design.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/memkrfaf1.jpg", + "image_sha256": "c7f4c7fc06512ad3f3e4e2b798aac01da9857ef7d156126a04ad43b604dce5ff", + "specs": [ + { + "group": "Specifications", + "label": "Item Type", + "value": "2x Macro Extension Tube (13/18 mm)" + }, + { + "group": "Specifications", + "label": "Camera/Lens Compatibility", + "value": "Canon RF Mount" + }, + { + "group": "Specifications", + "label": "Materials", + "value": "Aluminum" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.305 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "3.1 x 2.8 x 2.5\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1502602-REG/meike_mk_rf_af1_for_canon_mirrorless.html", + "archive_url": "https://web.archive.org/web/20260208090734/https://www.bhphotovideo.com/c/product/1502602-REG/meike_mk_rf_af1_for_canon_mirrorless.html", + "archive_timestamp": "20260208090734", + "fetched_at": "2026-09-12T17:27:26Z" + } + }, + { + "slug": "nikon-z5-ii-mirrorless-camera-with-24-50mm-f-4-6-3-lens-and-basic-bundle", + "name": "Nikon Z5 II Mirrorless Camera with 24-50mm f/4-6.3 Lens and Basic Bundle", + "brand": "Nikon", + "bh_sku": "NIZ522450AK", + "mpn": null, + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 1896.95, + "availability": "In Stock", + "condition": "New", + "description": "Comprising the core accessories needed to begin shooting, the Nikon Z5 II Mirrorless Camera with 24-50mm f/4-6.3 Lens and Basic Bundle from B&H combines the FX-format mirrorless body and NIKKOR Z 24-50mm f/4-6.3 zoom lens with a protective camera bag and memory card.", + "mount_type": "Nikon Z", + "sensor_size": "Full-Frame", + "focal_length": null, + "connectivity": "Wi-Fi 5 (802.11ac) / Bluetooth 5.0", + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/niz522450ak.jpg", + "image_sha256": "9b996915f687e6f47d668ac421d510c2c178af36301d9155b85a367a046753af", + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Nikon Z" + }, + { + "group": "Key Specs", + "label": "Effective Sensor Resolution", + "value": "24.5 Megapixel (6048 x 4032)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Sensor-Shift" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Photo | Native in Auto Mode: 100 to 64,000 (50 to 204,800 Extended) | Video | *Native: 100 to 51,200 (100 to 204,800 Extended) | *Base ISO Is Dependent on Selected Color Space" + }, + { + "group": "Key Specs", + "label": "Internal Recording", + "value": "N-RAW 12-Bit | Up to 4K at 25/29.97/23.98 fps | H.265 Long GOP/MOV 8/10-Bit | Up to UHD 4K at 25/29.97/50/59.94/23.98 fps | H.264 Long GOP/MP4 8-Bit | 1080p at 25/29.97/50/59.94/23.98 fps" + }, + { + "group": "Key Specs", + "label": "Video Output", + "value": "4:2:2 8/10-Bit via HDMI | Up to UHD 4K at 25/29.97/50/59.94/23.98 fps" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Dual Slot: SD/SDHC/SDXC (UHS-II)" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x 1/8\" / 3.5 mm Remote Input | 1x USB-C (USB 3.2 / 3.1 Gen 1) Data Output (Shared with Power Input)" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Wi-Fi 5 (802.11ac) / Bluetooth 5.0" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Articulating 3.2\" Touchscreen LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x EN-EL15c Rechargeable Lithium-Ion (Included) |  • Approx. 380 Shots" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Nikon Z" + }, + { + "group": "Imaging", + "label": "Effective Sensor Resolution", + "value": "Effective: 24.5 Megapixel (6048 x 4032) | Actual: 25.28 Megapixel" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "35.9 x 23.9 mm (Full-Frame) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1x | *Additional Crop Occurs in Select Video Modes" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Sensor-Shift, 5-Axis" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Mechanical Focal Plane Shutter and Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "1/8000 to 30 Second" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb & Time Mode" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Photo | Native in Auto Mode: 100 to 64,000 (50 to 204,800 Extended) | Video | *Native: 100 to 51,200 (100 to 204,800 Extended) | *Base ISO Is Dependent on Selected Color Space" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Highlight Weighted, Matrix, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-5 to +5 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "-4 to 17 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Presets: Auto, Cloudy, Color Temperature, Direct Sunlight, Flash, Fluorescent, Incandescent, Preset Manual, Shade" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 30 fps at Maximum Resolution" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/5/10/20-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 3:2, 16:9" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "HEIF, JPEG, Raw" + }, + { + "group": "Still Image Capture", + "label": "Bit Depth", + "value": "14-Bit" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "N-RAW 12-Bit | 4032 x 2268 at 25/29.97/23.98 fps (340 to 420 Mb/s) | 3984 x 2240 at 23.98/25/29.97 fps (330 to 410 Mb/s)* | H.265 Long GOP/MOV 8/10-Bit | 3840 x 2160 at 25/29.97/50/59.94/23.98 fps (150 to 340 Mb/s) | 1920 x 1080p at 100/23.98/120/50/25/29.97/59.94 fps (40 to 190 Mb/s) | H.264 Long GOP/MP4 8-Bit | 1920 x 1080p at 25/29.97/50/59.94/23.98 fps30 to 50 Mb/s) | *Sensor Crops During Recording" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "4:2:2 8/10-Bit via HDMI | 3840 x 2160 at 25/29.97/50/59.94/23.98 fps | 1920 x 1080 at 100/59.94/23.98/120/25/29.97/50 fps" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "2-Hour 5-Minute Maximum" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "MOV, Raw: 24-Bit 48 kHz AAC Audio | MP4: 16-Bit 48 kHz LPCM Audio" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Dual Slot: SD/SDHC/SDXC (UHS-II)" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x 1/8\" / 3.5 mm Remote Input | 1x USB-C (USB 3.2 / 3.1 Gen 1) Data Output (Shared with Power Input)" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "Wi-Fi 5 (802.11ac) / Bluetooth 5.0" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: SnapBridge | Functionality: Access Stored Files, Firmware Update, Remote Control" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Articulating 3.2\" Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "2,100,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Electronic (OLED)" + }, + { + "group": "Viewfinder", + "label": "Size", + "value": "0.5\"" + }, + { + "group": "Viewfinder", + "label": "Resolution", + "value": "3,690,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Eye Point", + "value": "21 mm" + }, + { + "group": "Viewfinder", + "label": "Coverage", + "value": "100%" + }, + { + "group": "Viewfinder", + "label": "Magnification", + "value": "Approx. 0.8x" + }, + { + "group": "Viewfinder", + "label": "Diopter Adjustment", + "value": "-4 to +2" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Continuous-Servo AF, Full-Time Servo, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Contrast Detection, Phase Detection: 273" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-10 to +19 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "No" + }, + { + "group": "Flash", + "label": "Flash Modes", + "value": "First-Curtain Sync, Off, Rear Curtain Sync/Red-Eye Reduction, Rear Sync, Red-Eye Reduction, Slow Sync, Slow Sync/Red-Eye Reduction" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "1/200 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-3 to +1 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "TTL" + }, + { + "group": "Flash", + "label": "External Flash Connection", + "value": "Shoe Mount" + }, + { + "group": "General", + "label": "Battery", + "value": "1x EN-EL15c Rechargeable Lithium-Ion (Included) |  • Approx. 380 Shots" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C up to 85% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "5.3 x 4 x 2.8\" / 134 x 100.5 x 72 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "1.4 lb / 620 g (Body Only) | 1.5 lb / 700 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.555 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7.9 x 7.8 x 5.1\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1931819-REG/nikon_z5_ii_mirrorless_camera.html", + "archive_url": "https://web.archive.org/web/20260121132358/https://www.bhphotovideo.com/c/product/1931819-REG/nikon_z5_ii_mirrorless_camera.html", + "archive_timestamp": "20260121132358", + "fetched_at": "2026-09-12T17:27:30Z" + } + }, + { + "slug": "nikon-z5-ii-mirrorless-camera-with-basic-bundle", + "name": "Nikon Z5 II Mirrorless Camera with Basic Bundle", + "brand": "Nikon", + "bh_sku": "NIZ52AK", + "mpn": null, + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 1596.95, + "availability": "In Stock", + "condition": "New", + "description": "Comprising the core accessories needed to begin shooting, the Nikon Z5 II Mirrorless Camera with Basic Bundle from B&H combines the FX-format mirrorless body with a protective camera bag and memory card.", + "mount_type": "Nikon Z", + "sensor_size": "Full-Frame", + "focal_length": null, + "connectivity": "Wi-Fi 5 (802.11ac) / Bluetooth 5.0", + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/niz52ak.jpg", + "image_sha256": "04f9a0f7a5552b8f3f43950b2878571b23ceaaee023cd78383b7062c78722c01", + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Nikon Z" + }, + { + "group": "Key Specs", + "label": "Effective Sensor Resolution", + "value": "24.5 Megapixel (6048 x 4032)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Sensor-Shift" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Photo | Native in Auto Mode: 100 to 64,000 (50 to 204,800 Extended) | Video | *Native: 100 to 51,200 (100 to 204,800 Extended) | *Base ISO Is Dependent on Selected Color Space" + }, + { + "group": "Key Specs", + "label": "Internal Recording", + "value": "N-RAW 12-Bit | Up to 4K at 25/29.97/23.98 fps | H.265 Long GOP/MOV 8/10-Bit | Up to UHD 4K at 25/29.97/50/59.94/23.98 fps | H.264 Long GOP/MP4 8-Bit | 1080p at 25/29.97/50/59.94/23.98 fps" + }, + { + "group": "Key Specs", + "label": "Video Output", + "value": "4:2:2 8/10-Bit via HDMI | Up to UHD 4K at 25/29.97/50/59.94/23.98 fps" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Dual Slot: SD/SDHC/SDXC (UHS-II)" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x 1/8\" / 3.5 mm Remote Input | 1x USB-C (USB 3.2 / 3.1 Gen 1) Data Output (Shared with Power Input)" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Wi-Fi 5 (802.11ac) / Bluetooth 5.0" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Articulating 3.2\" Touchscreen LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x EN-EL15c Rechargeable Lithium-Ion (Included) |  • Approx. 380 Shots" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Nikon Z" + }, + { + "group": "Imaging", + "label": "Effective Sensor Resolution", + "value": "Effective: 24.5 Megapixel (6048 x 4032) | Actual: 25.28 Megapixel" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "35.9 x 23.9 mm (Full-Frame) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1x | *Additional Crop Occurs in Select Video Modes" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Sensor-Shift, 5-Axis" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Mechanical Focal Plane Shutter and Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "1/8000 to 30 Second" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb & Time Mode" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Photo | Native in Auto Mode: 100 to 64,000 (50 to 204,800 Extended) | Video | *Native: 100 to 51,200 (100 to 204,800 Extended) | *Base ISO Is Dependent on Selected Color Space" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Highlight Weighted, Matrix, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-5 to +5 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "-4 to 17 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Presets: Auto, Cloudy, Color Temperature, Direct Sunlight, Flash, Fluorescent, Incandescent, Preset Manual, Shade" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 30 fps at Maximum Resolution" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/5/10/20-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 3:2, 16:9" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "HEIF, JPEG, Raw" + }, + { + "group": "Still Image Capture", + "label": "Bit Depth", + "value": "14-Bit" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "N-RAW 12-Bit | 4032 x 2268 at 25/29.97/23.98 fps (340 to 420 Mb/s) | 3984 x 2240 at 23.98/25/29.97 fps (330 to 410 Mb/s)* | H.265 Long GOP/MOV 8/10-Bit | 3840 x 2160 at 25/29.97/50/59.94/23.98 fps (150 to 340 Mb/s) | 1920 x 1080p at 100/23.98/120/50/25/29.97/59.94 fps (40 to 190 Mb/s) | H.264 Long GOP/MP4 8-Bit | 1920 x 1080p at 25/29.97/50/59.94/23.98 fps30 to 50 Mb/s) | *Sensor Crops During Recording" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "4:2:2 8/10-Bit via HDMI | 3840 x 2160 at 25/29.97/50/59.94/23.98 fps | 1920 x 1080 at 100/59.94/23.98/120/25/29.97/50 fps" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "2-Hour 5-Minute Maximum" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "MOV, Raw: 24-Bit 48 kHz AAC Audio | MP4: 16-Bit 48 kHz LPCM Audio" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Dual Slot: SD/SDHC/SDXC (UHS-II)" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x 1/8\" / 3.5 mm Remote Input | 1x USB-C (USB 3.2 / 3.1 Gen 1) Data Output (Shared with Power Input)" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "Wi-Fi 5 (802.11ac) / Bluetooth 5.0" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: SnapBridge | Functionality: Access Stored Files, Firmware Update, Remote Control" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Articulating 3.2\" Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "2,100,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Electronic (OLED)" + }, + { + "group": "Viewfinder", + "label": "Size", + "value": "0.5\"" + }, + { + "group": "Viewfinder", + "label": "Resolution", + "value": "3,690,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Eye Point", + "value": "21 mm" + }, + { + "group": "Viewfinder", + "label": "Coverage", + "value": "100%" + }, + { + "group": "Viewfinder", + "label": "Magnification", + "value": "Approx. 0.8x" + }, + { + "group": "Viewfinder", + "label": "Diopter Adjustment", + "value": "-4 to +2" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Continuous-Servo AF, Full-Time Servo, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Contrast Detection, Phase Detection: 273" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-10 to +19 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "No" + }, + { + "group": "Flash", + "label": "Flash Modes", + "value": "First-Curtain Sync, Off, Rear Curtain Sync/Red-Eye Reduction, Rear Sync, Red-Eye Reduction, Slow Sync, Slow Sync/Red-Eye Reduction" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "1/200 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-3 to +1 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "TTL" + }, + { + "group": "Flash", + "label": "External Flash Connection", + "value": "Shoe Mount" + }, + { + "group": "General", + "label": "Battery", + "value": "1x EN-EL15c Rechargeable Lithium-Ion (Included) |  • Approx. 380 Shots" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C up to 85% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "5.3 x 4 x 2.8\" / 134 x 100.5 x 72 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "1.4 lb / 620 g (Body Only) | 1.5 lb / 700 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.555 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7.9 x 7.8 x 5.1\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1931818-REG/nikon_z5_ii_mirrorless_camera.html", + "archive_url": "https://web.archive.org/web/20260125121011/https://www.bhphotovideo.com/c/product/1931818-REG/nikon_z5_ii_mirrorless_camera.html", + "archive_timestamp": "20260125121011", + "fetched_at": "2026-09-12T17:27:30Z" + } + }, + { + "slug": "nikon-zf-mirrorless-camera-with-24-70mm-f-4-lens-silver", + "name": "Nikon Zf Mirrorless Camera with 24-70mm f/4 Lens (Silver)", + "brand": "Nikon", + "bh_sku": "NIZFS2470K", + "mpn": "2016", + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 2496.95, + "availability": "In Stock", + "condition": "New", + "description": "Pairing heritage styling with a versatile zoom, the silver Nikon Zf Mirrorless Camera with 24-70mm f/4 Lens bundles the classic-looking full-frame camera body with the NIKKOR Z 24-70mm f/4 S standard zoom.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": "Wi-Fi 5 (802.11ac) / Bluetooth 5.0", + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/nizfs2470k.jpg", + "image_sha256": "93475e6ab617face86b71407c51fd31cde0c547b7586dac3eeafddbdbe793a20", + "specs": [ + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Photo | Native in Manual Mode: 100 to 64,000 (50 to 204,800 Extended) | Video | Native in Manual Mode: 100 to 51,200 (100 to 204,800 Extended)" + }, + { + "group": "Key Specs", + "label": "Internal Recording", + "value": "H.265/MOV/MP4 8/10-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94 fps | 1920 x 1080 at 23.98/25/29.97/50/59.94/100/120 fps" + }, + { + "group": "Key Specs", + "label": "Video Output", + "value": "4:2:2 8/10-Bit via HDMI | 3840 x 2160 at 23.98/25/29.97/50/59.94 fps | 1920 x 1080 at 23.98/25/29.97/50/59.94/100/120 fps" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Slot 1: SD/SDHC/SDXC (UHS-II) | Slot 2: microSD/microSDHC/microSDXC (UHS-I)" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x USB-C Data Output (Shared with Power Input)" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Wi-Fi 5 (802.11ac) / Bluetooth 5.0" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Articulating 3.2\" Touchscreen LCD | Status Display (Top)" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x EN-EL15c Rechargeable, 7 VDC, 2280 mAh (Included)" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Shutter | 1/8000 to 30 Seconds in Manual Mode | 1/8000 to 4 Seconds in Shutter Priority Mode | Mechanical Shutter | 1/8000 to 30 Seconds in Manual Mode | 1/8000 to 4 Seconds in Shutter Priority Mode" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Photo | Native in Manual Mode: 100 to 64,000 (50 to 204,800 Extended) | Video | Native in Manual Mode: 100 to 51,200 (100 to 204,800 Extended)" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "H.265/MOV/MP4 8/10-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94 fps | 1920 x 1080 at 23.98/25/29.97/50/59.94/100/120 fps" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "4:2:2 8/10-Bit via HDMI | 3840 x 2160 at 23.98/25/29.97/50/59.94 fps | 1920 x 1080 at 23.98/25/29.97/50/59.94/100/120 fps" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "2-Hour 5-Minute Maximum" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Slot 1: SD/SDHC/SDXC (UHS-II) | Slot 2: microSD/microSDHC/microSDXC (UHS-I)" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x USB-C Data Output (Shared with Power Input)" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "Wi-Fi 5 (802.11ac) / Bluetooth 5.0" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Articulating 3.2\" Touchscreen LCD | Status Display (Top)" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "2,100,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Resolution", + "value": "3,690,000 Dot" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Automatic, Focus Lock AF Area Mode, Full-Time Servo, Manual Focus, Single-Servo AF, Touch AF & Shutter" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Photo, Video | Contrast Detection, Phase Detection: 273" + }, + { + "group": "General", + "label": "Battery", + "value": "1x EN-EL15c Rechargeable, 7 VDC, 2280 mAh (Included)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C up to 85% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "5.7 x 4.1 x 1.9\" / 144 x 103 x 49 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "1.4 lb / 630 g (Body Only) | 1.6 lb / 710 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.53 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "8.7 x 7.2 x 5.2\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1918832-REG/nikon_2016_zf_mirrorless_camera_with.html", + "archive_url": "https://web.archive.org/web/20251116130233/https://www.bhphotovideo.com/c/product/1918832-REG/nikon_2016_zf_mirrorless_camera_with.html", + "archive_timestamp": "20251116130233", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "panasonic-lumix-s9-mirrorless-camera-with-18-40mm-f-4-5-6-3-lens-black", + "name": "Panasonic Lumix S9 Mirrorless Camera with 18-40mm f/4.5-6.3 Lens (Black)", + "brand": "Panasonic", + "bh_sku": "PADCS91840BQ", + "mpn": "DC-S9NK9", + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 1397.99, + "availability": "In Stock", + "condition": "New", + "description": "Packing the power of full-frame into an ultralight and compact build, the Panasonic LUMIX S9 Mirrorless Camera, presented here in black, is the perfect on-the-go camera for content creators. While smartphones continue to advance in their photo and video capabilities, a uniquely small full-frame system such as the S9 provides you with significantly more power without the burden of the size of a typical mirrorless or DSLR camera. A 24.2MP full-frame sensor is utilized within the S9, which makes creating high-quality images much easier, even in dimly lit situations. You also have the advantage of choosing from numerous L-mount lenses to suite your needs. Overall, the simplicity and convenience of the S9 makes it an excellent tool for elevating your ability to quickly create and share impactful images.", + "mount_type": "L-Mount", + "sensor_size": "Full-Frame", + "focal_length": null, + "connectivity": "Bluetooth 5.0 / Wi-Fi 5 (802.11ac)", + "megapixels": 24.2, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "L-Mount" + }, + { + "group": "Key Specs", + "label": "Effective Sensor Resolution", + "value": "24.2 Megapixel (6000 x 4000)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Sensor-Shift" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 51,200 (50 to 204,800 Extended)" + }, + { + "group": "Key Specs", + "label": "Max Recording Modes", + "value": "H.265 Long GOP/MOV 4:2:0 10-Bit | Up to 5.9K at 23.98/24.00/25/29.97 fps | H.265 Long GOP/MP4/MP4 Lite 4:2:0 8/10-Bit | Up to 4K at 25 fps | H.264 Long GOP/H.265 Long GOP/MOV 4:2:2/4:2:0 | Up to DCI 4K at 23.98/24.00/25/29.97 fps" + }, + { + "group": "Key Specs", + "label": "Max Video Output", + "value": "4:2:2 8/10-Bit | Up to DCI 4K" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-II) [V90 or Faster Recommended]" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x USB-C (Data) Output (Shared with Power Input)" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Bluetooth 5.0 / Wi-Fi 5 (802.11ac)" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Free-Angle Tilting 3\" Touchscreen LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x DMW-BLK22 Rechargeable Lithium-Ion, 7.2 VDC, 2200 mAh (Included)" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "L-Mount" + }, + { + "group": "Imaging", + "label": "Sensor Resolution", + "value": "Effective: 24.2 Megapixel (6000 x 4000) | Actual: 25.3 Megapixel" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "35.6 x 23.8 mm (Full-Frame) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1x | *Additional Crop Occurs in Select Video Modes" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Sensor-Shift, 5-Axis" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Shutter | 1/8000 to 60 Seconds in Manual Mode | 1/16000 to 1/25 Second in Movie Mode" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb Mode" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 51,200 (50 to 204,800 Extended)" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Highlight Weighted, Multiple, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-5 to +5 EV (1/3 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "0 to 18 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "2500 to 10,000K | Presets: AWB, Cloudy, Color Temperature, Daylight, Incandescent, Shade, White Set 1, White Set 2, White Set 3, White Set 4" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 30 fps at Maximum Resolution" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/10-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 2:1, 3:2, 4:3, 16:9, 65:24" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "JPEG, Raw" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "H.265 Long GOP/MOV 4:2:0 10-Bit | 5952 x 3968 at 23.98/24.00/25/29.97 fps (200 Mb/s) | 5888 x 3312 at 23.98/24.00/25/29.97 fps (200 Mb/s) | 5952 x 3136 at 23.98/24.00/25/29.97 fps (200 Mb/s) | H.265 Long GOP/MP4/MP4 Lite 4:2:0 8/10-Bit | 3840 x 2560 at 25 fps | 3840 x 2160 at 23.98/25/29.97 fps (72 to 100 Mb/s) | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps (20 to 28 Mb/s) | H.264 Long GOP/H.265 Long GOP/MOV 4:2:2/4:2:0 | 4096 x 2160 at 23.98/24.00/25/29.97 fps (150 Mb/s) | 3840 x 2160 at 23.98/24.00/25/29.97 fps (150 Mb/s) | 1920 x 1080 at 23.98/24.00/29.97/47.95/48.00/50/59.94/100/120 fps (100 to 150 Mb/s)" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "4:2:2 8/10-Bit | 4096 x 2160 | 3840 x 2160 | 1920 x 1080p | 1920 x 1080i" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Yes" + }, + { + "group": "Video Capture", + "label": "Gamma Curve", + "value": "HDR-HLG, Panasonic V-Log" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "No" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "MOV: 2-Channel 24-Bit 48 kHz LPCM Audio | MP4: 2-Channel 16-Bit 48 kHz AAC Audio" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-II) [V90 or Faster Recommended]" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x USB-C (Data) Output (Shared with Power Input)" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "Bluetooth 5.0 / Wi-Fi 5 (802.11ac)" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: LUMIX Lab / LUMIX Sync | Functionality: Access Stored Files, Adjust Settings, Firmware Update, Remote Control, View Live Feed" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Free-Angle Tilting 3\" Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "1,840,000 Dot" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Continuous-Servo AF, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Contrast Detection, Phase Detection: 779" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "No" + }, + { + "group": "Flash", + "label": "Shoe Mount", + "value": "1x Cold Shoe" + }, + { + "group": "Flash", + "label": "Non-Shoe Flash Connection", + "value": "No" + }, + { + "group": "General", + "label": "Battery", + "value": "1x DMW-BLK22 Rechargeable Lithium-Ion, 7.2 VDC, 2200 mAh (Included)" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C at 10 to 80% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "4.96 x 2.91 x 1.84\" / 12.6 x 7.39 x 4.67 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "1 lb / 403 g (Body Only) | 1 lb / 486 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.75 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "11.7 x 7.2 x 5.7\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1936325-REG/panasonic_dc_s9nk9_lumix_s9_mirrorless_camera.html", + "archive_url": "https://web.archive.org/web/20260814033110/https://www.bhphotovideo.com/c/product/1936325-REG/panasonic_dc_s9nk9_lumix_s9_mirrorless_camera.html", + "archive_timestamp": "20260814033110", + "fetched_at": "2026-09-12T17:27:30Z" + } + }, + { + "slug": "panasonic-lumix-s9-mirrorless-camera-with-28-200mm-f-4-7-1-lens-and-street-travel-photography-kit-jet-black", + "name": "Panasonic Lumix S9 Mirrorless Camera with 28-200mm f/4-7.1 Lens and Street-Travel Photography Kit (Jet Black)", + "brand": "Panasonic", + "bh_sku": "PADCS92820SK", + "mpn": null, + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 1497.99, + "availability": "In Stock", + "condition": "New", + "description": "Tailored for on-the-go shots, the jet black Panasonic Lumix S9 Mirrorless Camera with 28-200mm f/4-7.1 Lens and Street-Travel Photography Kit from B&H combines the full-frame system with a compact, wide-to-tele zoom lens, a protective camera bag, memory card, and camera strap. The simplicity and convenience of this kit make it ideal for quickly creating impactful images.", + "mount_type": "L-Mount", + "sensor_size": "35.6 x 23.8 mm (Full-Frame) CMOS", + "focal_length": "28 to 200mm", + "connectivity": null, + "megapixels": 24.2, + "capacity_gb": null, + "image_path": "images/products/padcs92820sk.jpg", + "image_sha256": "55753cd1127a1ce7e6618b7b3a15649485263a607e5962a139b3b8e5fc481312", + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "L-Mount" + }, + { + "group": "Key Specs", + "label": "Sensor Resolution", + "value": "Actual: 25.3 Megapixel | Effective: 24.2 Megapixel (6000 x 4000)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "35.6 x 23.8 mm (Full-Frame) CMOS" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Sensor-Shift" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 51,200 (50 to 204,800 Extended)" + }, + { + "group": "Key Specs", + "label": "Internal Recording", + "value": "H.264 Long GOP/H.265 Long GOP/MOV 4:2:2/4:2:0 | DCI 4K (4096 x 2160) at 23.98/24.00/25/29.97 fps [150 Mb/s] | 3840 x 2160 at 23.98/24.00/25/29.97 fps [150 Mb/s] | 1920 x 1080 at 23.98/24.00/29.97/47.95/48.00/50/59.94/100/120 fps [100 to 150 Mb/s] | H.265 Long GOP/MOV 4:2:0 10-Bit | 5952 x 3968 at 23.98/24.00/25/29.97 fps [200 Mb/s] | 5888 x 3312 at 23.98/24.00/25/29.97 fps [200 Mb/s] | 5952 x 3136 at 23.98/24.00/25/29.97 fps [200 Mb/s] | H.265 Long GOP/MP4/MP4 Lite 4:2:0 8/10-Bit | 3840 x 2560 at 25 fps [50 Mb/s] | 3840 x 2160 at 23.98/25/29.97 fps [72 to 100 Mb/s] | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps [20 to 28 Mb/s]" + }, + { + "group": "Key Specs", + "label": "Video Output", + "value": "4:2:2 8/10-Bit via HDMI | 4096 x 2160 | 3840 x 2160 | 1920 x 1080p | 1920 x 1080i" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-II) [V90 or Faster Recommended]" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x USB-C Data Output (Shared with Power Input)" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Free-Angle Tilting 3\" Touchscreen LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x BMW-BLK22 Rechargeable Lithium-Ion, 7.2 VDC, 2200 mAh (Included)" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "L-Mount" + }, + { + "group": "Imaging", + "label": "Sensor Resolution", + "value": "Actual: 25.3 Megapixel | Effective: 24.2 Megapixel (6000 x 4000)" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "35.6 x 23.8 mm (Full-Frame) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1x | *Additional Crop Occurs in Select Video Modes" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Sensor-Shift, 5-Axis" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Shutter | 1/8000 to 60 Seconds in Manual Mode | 1/16000 to 1/25 Second in Movie Mode" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb Mode" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 51,200 (50 to 204,800 Extended)" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Highlight Weighted, Multiple, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-5 to +5 EV (1/3 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "0 to 18 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "2500 to 10,000K | Presets: AWB, Cloudy, Color Temperature, Daylight, Incandescent, Shade, White Set 1, White Set 2, White Set 3, White Set 4" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 30 fps at Maximum Resolution" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/10-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 2:1, 3:2, 4:3, 16:9, 65:24" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "JPEG, Raw" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "H.264 Long GOP/H.265 Long GOP/MOV 4:2:2/4:2:0 | DCI 4K (4096 x 2160) at 23.98/24.00/25/29.97 fps [150 Mb/s] | 3840 x 2160 at 23.98/24.00/25/29.97 fps [150 Mb/s] | 1920 x 1080 at 23.98/24.00/29.97/47.95/48.00/50/59.94/100/120 fps [100 to 150 Mb/s] | H.265 Long GOP/MOV 4:2:0 10-Bit | 5952 x 3968 at 23.98/24.00/25/29.97 fps [200 Mb/s] | 5888 x 3312 at 23.98/24.00/25/29.97 fps [200 Mb/s] | 5952 x 3136 at 23.98/24.00/25/29.97 fps [200 Mb/s] | H.265 Long GOP/MP4/MP4 Lite 4:2:0 8/10-Bit | 3840 x 2560 at 25 fps [50 Mb/s] | 3840 x 2160 at 23.98/25/29.97 fps [72 to 100 Mb/s] | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps [20 to 28 Mb/s]" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "4:2:2 8/10-Bit via HDMI | 4096 x 2160 | 3840 x 2160 | 1920 x 1080p | 1920 x 1080i" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Yes" + }, + { + "group": "Video Capture", + "label": "Gamma Curve", + "value": "HDR-HLG, Panasonic V-Log" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "15-Minute Maximum in 4K" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "MOV: 2-Channel 24-Bit 48 kHz LPCM Audio | MP4: 2-Channel 16-Bit 48 kHz AAC Audio" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-II) [V90 or Faster Recommended]" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x USB-C Data Output (Shared with Power Input)" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: LUMIX Lab / LUMIX Sync | Functionality: Access Stored Files, Adjust Settings, Firmware Update, Setup, View Live Feed" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Free-Angle Tilting 3\" Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "1,840,000 Dot" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Continuous-Servo AF, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Contrast Detection, Phase Detection: 779" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "6 to +18 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "No" + }, + { + "group": "General", + "label": "Battery", + "value": "1x BMW-BLK22 Rechargeable Lithium-Ion, 7.2 VDC, 2200 mAh (Included)" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Cold Shoe" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C at 10 to 80% Humidity" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "4.96 x 2.91 x 1.84\" / 12.6 x 7.39 x 4.67 cm" + }, + { + "group": "General", + "label": "Weight", + "value": "0.9 lb / 403 g (Body Only) | 1.1 lb / 486 g (With Battery, Recording Media)" + }, + { + "group": "Kit Lens", + "label": "Focal Length", + "value": "28 to 200mm" + }, + { + "group": "Kit Lens", + "label": "Aperture", + "value": "Maximum: f/4 to 7.1 | Minimum: f/32 to 45" + }, + { + "group": "Kit Lens", + "label": "Angle of View", + "value": "75° to 12°" + }, + { + "group": "Kit Lens", + "label": "Magnification", + "value": "1:2 Macro Reproduction Ratio | 0.5x Magnification" + }, + { + "group": "Kit Lens", + "label": "Minimum Focus Distance", + "value": "5.5\" / 14 cm" + }, + { + "group": "Kit Lens", + "label": "Optical Design", + "value": "17 Elements in 13 Groups" + }, + { + "group": "Kit Lens", + "label": "Aperture/Iris Blades", + "value": "9, Rounded" + }, + { + "group": "Kit Lens", + "label": "Focus Type", + "value": "Autofocus" + }, + { + "group": "Kit Lens", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Kit Lens", + "label": "Filter Size", + "value": "67 mm (Front)" + }, + { + "group": "Kit Lens", + "label": "Dimensions", + "value": "ø: 3 x L: 3.7\" / ø: 77.3 x L: 93.4 mm" + }, + { + "group": "Kit Lens", + "label": "Weight", + "value": "14.6 oz / 413 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "3.065 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "11 x 6.6 x 5.1\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1926930-REG/panasonic_panasonic_lumix_s9_mirrorless.html", + "archive_url": "https://web.archive.org/web/20251124180908/https://www.bhphotovideo.com/c/product/1926930-REG/panasonic_panasonic_lumix_s9_mirrorless.html", + "archive_timestamp": "20251124180908", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "sony-zv-e10-mirrorless-camera-with-16-50mm-f-3-5-5-6-ii-lens-black", + "name": "Sony ZV-E10 Mirrorless Camera with 16-50mm f/3.5-5.6 II Lens (Black)", + "brand": "Sony", + "bh_sku": "SOZVE10KB", + "mpn": "ZVE10KB", + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 798.0, + "availability": "In Stock", + "condition": "New", + "description": "Ideal for on-the-go photographers, videographers, and content creators, the ZV-E10 Mirrorless Camera with 16-50mm f/3.5-5.6 II Lens bundles the compact, versatile APS-C camera with the E PZ 16-50mm f/3.5-5.6 OSS II Lens, providing advanced video features such as autofocus while zooming and improved Optical SteadyShot image stabilization.", + "mount_type": "Sony E", + "sensor_size": "23.5 x 15.6 mm (APS-C) CMOS", + "focal_length": null, + "connectivity": null, + "megapixels": 24.2, + "capacity_gb": null, + "image_path": "images/products/sozve10kb.jpg", + "image_sha256": "9e2577d6c30ee01b7082002f8b3d293f5b952dbe24a127c5aa140b9e7a3e888b", + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Sony E" + }, + { + "group": "Key Specs", + "label": "Sensor Resolution", + "value": "Actual: 25 Megapixel | Effective: 24.2 Megapixel (6000 x 4000)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "23.5 x 15.6 mm (APS-C) CMOS" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Digital" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Photo | Native in Manual Mode: 100 to 32,000 (50 to 51,200 Extended) | Native in Auto Mode: 100 to 6400 | Video | Native in Manual Mode: 100 to 32,000 | Native in Auto Mode: 100 to 6400" + }, + { + "group": "Key Specs", + "label": "Internal Recording", + "value": "XAVC S 4:2:0 8-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97 fps [60 to 100 Mb/s VBR] | 1920 x 1080p at 23.98/25/29.97/50/59.94/100/120 fps [16 to 100 Mb/s VBR]" + }, + { + "group": "Key Specs", + "label": "Video Output", + "value": "4:2:2 8-Bit via HDMI | UHD 4K (3840 x 2160) up to 23.98/25/29.97 fps" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC/Memory Stick Duo Hybrid (UHS-I)" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x USB-C (USB 3.2 / 3.1 Gen 1) Data Output (Shared with Power Input)" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Articulating 3\" Touchscreen LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x NP-FW50 Rechargeable Lithium-Ion, 7.2 VDC, 1080 mAh (Included) |  • Approx. 440 Shots" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Sony E" + }, + { + "group": "Imaging", + "label": "Sensor Resolution", + "value": "Actual: 25 Megapixel | Effective: 24.2 Megapixel (6000 x 4000)" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "23.5 x 15.6 mm (APS-C) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1.5x | *Additional Crop Occurs in Select Video Modes" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Digital (Video Only)" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Mechanical Focal Plane Shutter and Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "1/4000 to 30 Seconds | 1/4000 to 1/4 Second in Movie Mode" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb Mode" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Photo | Native in Manual Mode: 100 to 32,000 (50 to 51,200 Extended) | Native in Auto Mode: 100 to 6400 | Video | Native in Manual Mode: 100 to 32,000 | Native in Auto Mode: 100 to 6400" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Average, Center-Weighted Average, Highlight Weighted, Multi, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-5 to +5 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "-2 to 20 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "2500 to 9900K | Presets: ATW, AWB, Auto, Cloudy, Color Temperature, Color Temperature Filter, Custom, Daylight, Flash, Fluorescent (Cool White), Fluorescent (Day White), Fluorescent (Daylight), Fluorescent (Warm White), Incandescent, Shade, Underwater" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 11 fps at Maximum Resolution for up to 46 Frames (Raw) / 116 Frames (JPEG)" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/5/10-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 3:2, 4:3, 16:9" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "JPEG, Raw" + }, + { + "group": "Still Image Capture", + "label": "Bit Depth", + "value": "14-Bit" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "XAVC S 4:2:0 8-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97 fps [60 to 100 Mb/s VBR] | 1920 x 1080p at 23.98/25/29.97/50/59.94/100/120 fps [16 to 100 Mb/s VBR]" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "4:2:2 8-Bit via HDMI | UHD 4K (3840 x 2160) up to 23.98/25/29.97 fps" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Yes" + }, + { + "group": "Video Capture", + "label": "Gamma Curve", + "value": "HDR-HLG, Sony S-Log 2, Sony S-Log 3" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "No" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo (Microphone Location: Top)" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "XAVC S: 2-Channel 16-Bit 48 kHz LPCM Audio" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC/Memory Stick Duo Hybrid (UHS-I)" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x USB-C (USB 3.2 / 3.1 Gen 1) Data Output (Shared with Power Input)" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: Imaging Edge Mobile | Functionality: Access Stored Files, Remote Control" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Articulating 3\" Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "921,600 Dot" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Automatic, Continuous-Servo AF, Direct Manual Focus, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Contrast Detection, Phase Detection: 425" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-3 to +20 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "No" + }, + { + "group": "Flash", + "label": "Flash Modes", + "value": "Auto, Fill Flash, Off, Rear Sync, Slow Sync" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "1/160 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-3 to +3 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "TTL" + }, + { + "group": "Flash", + "label": "External Flash Connection", + "value": "Shoe Mount" + }, + { + "group": "General", + "label": "Battery", + "value": "1x NP-FW50 Rechargeable Lithium-Ion, 7.2 VDC, 1080 mAh (Included) |  • Approx. 440 Shots" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Intelligent Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C" + }, + { + "group": "General", + "label": "Storage Conditions", + "value": "-4 to 131°F / -20 to 55°C" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "4.5 x 2.5 x 1.8\" / 115.2 x 64.2 x 44.8 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "12.1 oz / 343 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.32 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.4 x 6.4 x 4.5\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1912025-REG/sony_zve10kb_zv_e10_mirrorless_camera_with.html", + "archive_url": "https://web.archive.org/web/20251121074739/https://www.bhphotovideo.com/c/product/1912025-REG/sony_zve10kb_zv_e10_mirrorless_camera_with.html", + "archive_timestamp": "20251121074739", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "sony-zv-e10-mirrorless-camera-with-16-50mm-f-3-5-5-6-ii-lens-white", + "name": "Sony ZV-E10 Mirrorless Camera with 16-50mm f/3.5-5.6 II Lens (White)", + "brand": "Sony", + "bh_sku": "SOZVE10KW", + "mpn": "ZVE10KW", + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 848.0, + "availability": "In Stock", + "condition": "New", + "description": "Perfect for vloggers, the Sony ZV-E10 pairs a large APS-C sensor and mirrorless versatility with a specialized feature-set built just for content creators. Improving upon the ubiquitous smartphone, the ZV-E10 is an Alpha camera that brings improved image quality, greater choice of lenses, and increased control to up your creativity when shooting.", + "mount_type": "Sony E", + "sensor_size": "APS-C", + "focal_length": "16 to 50mm (35mm Equivalent: 24 to 75mm)", + "connectivity": "Wi-Fi 4 (802.11n) / Bluetooth 4.1", + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/sozve10kw.jpg", + "image_sha256": "3ff788def79e966ef056ba71c2b83059283ddfd06a8da22453b93bdb73aa3995", + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Sony E" + }, + { + "group": "Key Specs", + "label": "Effective Sensor Resolution", + "value": "24.2 Megapixel (6000 x 4000)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "APS-C" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Digital" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Photo | Native in Manual Mode: 100 to 32,000 (50 to 51,200 Extended) | Native in Auto Mode: 100 to 6400 | Video | Native in Manual Mode: 100 to 32,000 | Native in Auto Mode: 100 to 6400" + }, + { + "group": "Key Specs", + "label": "Max Recording Modes", + "value": "XAVC S 4:2:0 8-Bit | Up to UHD 4K at 23.98/25/29.97 fps" + }, + { + "group": "Key Specs", + "label": "Max Video Output", + "value": "4:2:2 8-Bit | UHD 4K up to 23.98/25/29.97 fps" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC/Memory Stick Duo Hybrid (UHS-I)" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x USB-C 3.0 / 3.1/3.2 Gen 1 (Data) Output (Shared with Power Input)" + }, + { + "group": "Key Specs", + "label": "Wireless", + "value": "Wi-Fi 4 (802.11n) / Bluetooth 4.1" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Articulating 3\" Touchscreen LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x NP-FW50 Rechargeable Lithium-Ion, 7.2 VDC, 1080 mAh (Included) |  • Approx. 440 Shots" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Sony E" + }, + { + "group": "Imaging", + "label": "Effective Sensor Resolution", + "value": "Effective: 24.2 Megapixel (6000 x 4000) | Actual: 25 Megapixel" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "23.5 x 15.6 mm (APS-C) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1.5x | *Additional Crop Occurs in Select Video Modes" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Digital (Video Only)" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Mechanical Focal Plane Shutter and Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "1/4000 to 30 Seconds | 1/4000 to 1/4 Second in Movie Mode" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb Mode" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Photo | Native in Manual Mode: 100 to 32,000 (50 to 51,200 Extended) | Native in Auto Mode: 100 to 6400 | Video | Native in Manual Mode: 100 to 32,000 | Native in Auto Mode: 100 to 6400" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Average, Center-Weighted Average, Highlight Weighted, Multi, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-5 to +5 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "-2 to 20 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "2500 to 9900K | Presets: ATW, AWB, Auto, Cloudy, Color Temperature, Color Temperature Filter, Custom, Daylight, Flash, Fluorescent (Cool White), Fluorescent (Day White), Fluorescent (Daylight), Fluorescent (Warm White), Incandescent, Shade, Underwater" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 11 fps at Maximum Resolution for up to 46 Frames (Raw) / 116 Frames (JPEG)" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/5/10-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 3:2, 4:3, 16:9" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "JPEG, Raw" + }, + { + "group": "Still Image Capture", + "label": "Bit Depth", + "value": "14-Bit" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "XAVC S 4:2:0 8-Bit | 3840 x 2160 at 23.98/25/29.97 fps (60 to 100 Mb/s VBR) | 1920 x 1080p at 23.98/25/29.97/50/59.94/100/120 fps (16 to 100 Mb/s VBR)" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "4:2:2 8-Bit | 3840 x 2160 up to 23.98/25/29.97 fps" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Yes" + }, + { + "group": "Video Capture", + "label": "Gamma Curve", + "value": "HDR-HLG, Sony S-Log 2, Sony S-Log 3" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "No" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo (Microphone Location: Top)" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "XAVC S: 2-Channel 16-Bit 48 kHz LPCM Audio" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC/Memory Stick Duo Hybrid (UHS-I)" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x USB-C 3.0 / 3.1/3.2 Gen 1 (Data) Output (Shared with Power Input)" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "Wi-Fi 4 (802.11n) / Bluetooth 4.1" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: Imaging Edge Mobile | Functionality: Access Stored Files and Remote Control" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Articulating 3\" Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "921,600 Dot" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Automatic, Continuous-Servo AF, Direct Manual Focus, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Contrast Detection, Phase Detection: 425" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-3 to +20 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "No" + }, + { + "group": "Flash", + "label": "Flash Modes", + "value": "Auto, Fill Flash, Off, Rear Sync, Slow Sync" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "1/160 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-3 to +3 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "TTL" + }, + { + "group": "Flash", + "label": "Shoe Mount", + "value": "1x Intelligent Hot Shoe" + }, + { + "group": "Flash", + "label": "Non-Shoe Flash Connection", + "value": "No" + }, + { + "group": "General", + "label": "Battery", + "value": "1x NP-FW50 Rechargeable Lithium-Ion, 7.2 VDC, 1080 mAh (Included) |  • Approx. 440 Shots" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C" + }, + { + "group": "General", + "label": "Storage Conditions", + "value": "-4 to 131°F / -20 to 55°C" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "4.5 x 2.5 x 1.8\" / 115.2 x 64.2 x 44.8 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "12.1 oz / 343 g (With Battery, Recording Media)" + }, + { + "group": "Kit Lens", + "label": "Focal Length", + "value": "16 to 50mm (35mm Equivalent: 24 to 75mm)" + }, + { + "group": "Kit Lens", + "label": "Aperture", + "value": "Maximum: f/3.5 to 5.6 | Minimum: f/22 to 36" + }, + { + "group": "Kit Lens", + "label": "Angle of View", + "value": "83° to 32°" + }, + { + "group": "Kit Lens", + "label": "Magnification", + "value": "1:4.55 Macro Reproduction Ratio | 0.22x Magnification" + }, + { + "group": "Kit Lens", + "label": "Minimum Focus Distance", + "value": "From Camera Sensor: 0.82' / 0.25 m" + }, + { + "group": "Kit Lens", + "label": "Optical Design", + "value": "9 Elements in 8 Groups" + }, + { + "group": "Kit Lens", + "label": "Aperture/Iris Blades", + "value": "7" + }, + { + "group": "Kit Lens", + "label": "Focus Type", + "value": "Autofocus" + }, + { + "group": "Kit Lens", + "label": "Image Stabilization", + "value": "Yes" + }, + { + "group": "Kit Lens", + "label": "Filter Size", + "value": "40.5 mm (Front)" + }, + { + "group": "Kit Lens", + "label": "Dimensions", + "value": "ø: 2.6 x L: 1.2\" / ø: 66 x L: 31.3 mm" + }, + { + "group": "Kit Lens", + "label": "Weight", + "value": "3.8 oz / 107 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.555 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.4 x 6.4 x 2.8\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1912026-REG/sony_zve10kw_zv_e10_mirrorless_camera_with.html", + "archive_url": "https://web.archive.org/web/20260723152537/https://www.bhphotovideo.com/c/product/1912026-REG/sony_zve10kw_zv_e10_mirrorless_camera_with.html", + "archive_timestamp": "20260723152537", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "sony-a6700-mirrorless-camera-with-16-50mm-f-3-5-5-6-ii-lens-and-basic-bundle", + "name": "Sony a6700 Mirrorless Camera with 16-50mm f/3.5-5.6 II Lens and Basic Bundle", + "brand": "Sony", + "bh_sku": "SOA6700165BK", + "mpn": null, + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 1598.0, + "availability": "In Stock", + "condition": "New", + "description": "Comprising the core accessories needed to begin shooting, the Sony a6700 Mirrorless Camera with 16-50mm f/3.5-5.6 II Lens and Basic Bundle from B&H combines the APS-C mirrorless body with the E PZ 16-50mm f/3.5-5.6 OSS II zoom lens, a protective camera bag, a memory card, and a battery charger.", + "mount_type": "Sony E", + "sensor_size": "23.3 x 15.5 mm (APS-C) CMOS", + "focal_length": null, + "connectivity": null, + "megapixels": 26.0, + "capacity_gb": null, + "image_path": "images/products/soa6700165bk.jpg", + "image_sha256": "34280c717239d6aeafd311578b4ea02b358dc0101707a9cf61d59536abf225fc", + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Sony E" + }, + { + "group": "Key Specs", + "label": "Sensor Resolution", + "value": "Actual: 27 Megapixel | Effective: 26 Megapixel (6192 x 4128)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "23.3 x 15.5 mm (APS-C) CMOS" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Sensor-Shift" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Photo | Native in Manual Mode: 100 to 32,000 (50 to 102,400 Extended) | Native in Auto Mode: 100 to 6400 | Video | Native in Manual Mode: 100 to 32,000 | Native in Auto Mode: 100 to 6400" + }, + { + "group": "Key Specs", + "label": "Internal Recording", + "value": "XAVC HS 4:2:2 10-Bit | UHD 4K (3840 x 2160) at 23.98/50/59.94/100/120 fps [50 to 280 Mb/s] | XAVC HS 4:2:0 10-Bit | UHD 4K (3840 x 2160) at 23.98/50/59.94/100/120 fps [30 to 200 Mb/s] | XAVC S 4:2:2 10-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94/100/120 fps [100 to 280 Mb/s] | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps [50 Mb/s] | XAVC S 4:2:0 8-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94/100/120 fps [60 to 200 Mb/s] | 1920 x 1080 at 23.98/25/29.97/50/59.94/100/120 fps [16 to 100 Mb/s] | XAVC S-I 4:2:2 10-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94 fps [240 to 600 Mb/s] | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps [89 to 222 Mb/s]" + }, + { + "group": "Key Specs", + "label": "Video Output", + "value": "4:2:2 10-Bit via HDMI | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94 fps | HD (1920 x 1080) at 23.98/50/59.94 fps" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-II)" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x USB-C Data Output (Shared with Power Input)" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Articulating 3\" Touchscreen LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x NP-FZ100 Rechargeable Lithium-Ion (Included) |  • Approx. 550 Shots" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Sony E" + }, + { + "group": "Imaging", + "label": "Sensor Resolution", + "value": "Actual: 27 Megapixel | Effective: 26 Megapixel (6192 x 4128)" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "23.3 x 15.5 mm (APS-C) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1.5x | Additional Modes: 1.6x | *Additional Crop Occurs in Select Video Modes" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Sensor-Shift, 5-Axis" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Mechanical Focal Plane Shutter and Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Shutter | 1/8000 to 30 Seconds | Mechanical Shutter | 1/4000 to 30 Seconds" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb Mode" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Photo | Native in Manual Mode: 100 to 32,000 (50 to 102,400 Extended) | Native in Auto Mode: 100 to 6400 | Video | Native in Manual Mode: 100 to 32,000 | Native in Auto Mode: 100 to 6400" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Multi-Zone, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-5 to +5 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "-3 to 20 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "2500 to 9900K | Presets: ATW, AWB, Auto, Cloudy, Color Temperature, Color Temperature Filter, Custom, Daylight, Flash, Fluorescent (Cool White), Fluorescent (Day White), Fluorescent (Daylight), Fluorescent (Warm White), Incandescent, Shade, Underwater" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 11 fps at Maximum Resolution for up to 59 Frames (Raw) / 1000 Frames (JPEG)" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/5/10-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 3:2, 4:3, 16:9" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "HEIF, JPEG, Raw" + }, + { + "group": "Still Image Capture", + "label": "Bit Depth", + "value": "14-Bit" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "XAVC HS 4:2:2 10-Bit | UHD 4K (3840 x 2160) at 23.98/50/59.94/100/120 fps [50 to 280 Mb/s] | XAVC HS 4:2:0 10-Bit | UHD 4K (3840 x 2160) at 23.98/50/59.94/100/120 fps [30 to 200 Mb/s] | XAVC S 4:2:2 10-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94/100/120 fps [100 to 280 Mb/s] | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps [50 Mb/s] | XAVC S 4:2:0 8-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94/100/120 fps [60 to 200 Mb/s] | 1920 x 1080 at 23.98/25/29.97/50/59.94/100/120 fps [16 to 100 Mb/s] | XAVC S-I 4:2:2 10-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94 fps [240 to 600 Mb/s] | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps [89 to 222 Mb/s]" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "4:2:2 10-Bit via HDMI | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94 fps | HD (1920 x 1080) at 23.98/50/59.94 fps" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Yes" + }, + { + "group": "Video Capture", + "label": "Gamma Curve", + "value": "HDR-HLG, S Cinetone, Sony S-Log 3" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "No" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "XAVC: 2-Channel 16-Bit 48 kHz LPCM Audio" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-II)" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x USB-C Data Output (Shared with Power Input)" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: Creators' App | Functionality: Access Stored Files, Remote Control" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Articulating 3\" Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "1,030,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Electronic (OLED)" + }, + { + "group": "Viewfinder", + "label": "Size", + "value": "0.39\"" + }, + { + "group": "Viewfinder", + "label": "Resolution", + "value": "2,359,296 Dot" + }, + { + "group": "Viewfinder", + "label": "Eye Point", + "value": "22 mm" + }, + { + "group": "Viewfinder", + "label": "Coverage", + "value": "100%" + }, + { + "group": "Viewfinder", + "label": "Magnification", + "value": "Approx. 1.07x" + }, + { + "group": "Viewfinder", + "label": "Diopter Adjustment", + "value": "-4 to +3" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Automatic, Continuous-Servo AF, Direct Manual Focus, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Photo | Phase Detection: 759 | Video | Phase Detection: 495" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-3 to +20 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "No" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "1/160 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-3 to +3 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "TTL" + }, + { + "group": "Flash", + "label": "External Flash Connection", + "value": "Shoe Mount, Wireless" + }, + { + "group": "General", + "label": "Battery", + "value": "1x NP-FZ100 Rechargeable Lithium-Ion (Included) |  • Approx. 550 Shots" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Intelligent Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Materials", + "value": "Magnesium Alloy" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C" + }, + { + "group": "General", + "label": "Storage Conditions", + "value": "-4 to 131°F / -20 to 55°C" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "4.8 x 2.7 x 3\" / 122 x 69 x 75.1 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "0.9 lb / 411 g (Body Only) | 1.1 lb / 493 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.585 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6 x 5.5 x 4.7\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1928284-REG/sony_a6700_mirrorless_camera_with.html", + "archive_url": "https://web.archive.org/web/20251204225615/https://www.bhphotovideo.com/c/product/1928284-REG/sony_a6700_mirrorless_camera_with.html", + "archive_timestamp": "20251204225615", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "sony-a6700-mirrorless-camera-with-16-50mm-f-3-5-5-6-ii-lens-and-content-creation-kit", + "name": "Sony a6700 Mirrorless Camera with 16-50mm f/3.5-5.6 II Lens and Content Creation Kit", + "brand": "Sony", + "bh_sku": "SOA6700165CC", + "mpn": null, + "department_slug": "photography", + "subcategory_slug": "mirrorless-cameras", + "product_type": "Mirrorless Camera", + "price_usd": 1975.99, + "availability": "In Stock", + "condition": "New", + "description": "A comprehensive audio/video toolbox, this Sony a6700 Mirrorless Camera with 16-50mm f/3.5-5.6 II Lens and Content Creation Kit from B&H combines the APS-C camera body and E PZ 16-50mm f/3.5-5.6 OSS II zoom lens with a microphone, shooting grip, memory card, battery, and battery charger.", + "mount_type": "Sony E", + "sensor_size": "23.3 x 15.5 mm (APS-C) CMOS", + "focal_length": null, + "connectivity": null, + "megapixels": 26.0, + "capacity_gb": null, + "image_path": "images/products/soa6700165cc.jpg", + "image_sha256": "08cdb9048fec54f22da065b9ba14445d10be01c1d8fc9ef9c37f756860c6a2d9", + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Sony E" + }, + { + "group": "Key Specs", + "label": "Sensor Resolution", + "value": "Actual: 27 Megapixel | Effective: 26 Megapixel (6192 x 4128)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "23.3 x 15.5 mm (APS-C) CMOS" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Sensor-Shift" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Photo | Native in Manual Mode: 100 to 32,000 (50 to 102,400 Extended) | Native in Auto Mode: 100 to 6400 | Video | Native in Manual Mode: 100 to 32,000 | Native in Auto Mode: 100 to 6400" + }, + { + "group": "Key Specs", + "label": "Internal Recording", + "value": "XAVC HS 4:2:2 10-Bit | UHD 4K (3840 x 2160) at 23.98/50/59.94/100/120 fps [50 to 280 Mb/s] | XAVC HS 4:2:0 10-Bit | UHD 4K (3840 x 2160) at 23.98/50/59.94/100/120 fps [30 to 200 Mb/s] | XAVC S 4:2:2 10-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94/100/120 fps [100 to 280 Mb/s] | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps [50 Mb/s] | XAVC S 4:2:0 8-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94/100/120 fps [60 to 200 Mb/s] | 1920 x 1080 at 23.98/25/29.97/50/59.94/100/120 fps [16 to 100 Mb/s] | XAVC S-I 4:2:2 10-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94 fps [240 to 600 Mb/s] | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps [89 to 222 Mb/s]" + }, + { + "group": "Key Specs", + "label": "Video Output", + "value": "4:2:2 10-Bit via HDMI | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94 fps | HD (1920 x 1080) at 23.98/50/59.94 fps" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-II)" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Key Specs", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Key Specs", + "label": "Other I/O", + "value": "1x USB-C Data Output (Shared with Power Input)" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Articulating 3\" Touchscreen LCD" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "1x NP-FZ100 Rechargeable Lithium-Ion (Included) |  • Approx. 550 Shots" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Sony E" + }, + { + "group": "Imaging", + "label": "Sensor Resolution", + "value": "Actual: 27 Megapixel | Effective: 26 Megapixel (6192 x 4128)" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "23.3 x 15.5 mm (APS-C) CMOS" + }, + { + "group": "Imaging", + "label": "Sensor Crop (35mm Equivalent)", + "value": "Crop Factor: 1.5x | Additional Modes: 1.6x | *Additional Crop Occurs in Select Video Modes" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Sensor-Shift, 5-Axis" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Mechanical Focal Plane Shutter and Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Shutter | 1/8000 to 30 Seconds | Mechanical Shutter | 1/4000 to 30 Seconds" + }, + { + "group": "Exposure Control", + "label": "Bulb/Time Mode", + "value": "Bulb Mode" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Photo | Native in Manual Mode: 100 to 32,000 (50 to 102,400 Extended) | Native in Auto Mode: 100 to 6400 | Video | Native in Manual Mode: 100 to 32,000 | Native in Auto Mode: 100 to 6400" + }, + { + "group": "Exposure Control", + "label": "Metering Method", + "value": "Center-Weighted Average, Multi-Zone, Spot" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Aperture Priority, Auto, Manual, Program, Shutter Priority" + }, + { + "group": "Exposure Control", + "label": "Exposure Compensation", + "value": "-5 to +5 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Exposure Control", + "label": "Metering Range", + "value": "-3 to 20 EV" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "2500 to 9900K | Presets: ATW, AWB, Auto, Cloudy, Color Temperature, Color Temperature Filter, Custom, Daylight, Flash, Fluorescent (Cool White), Fluorescent (Day White), Fluorescent (Daylight), Fluorescent (Warm White), Incandescent, Shade, Underwater" + }, + { + "group": "Exposure Control", + "label": "Continuous Shooting", + "value": "Up to 11 fps at Maximum Resolution for up to 59 Frames (Raw) / 1000 Frames (JPEG)" + }, + { + "group": "Exposure Control", + "label": "Interval Recording", + "value": "Yes" + }, + { + "group": "Exposure Control", + "label": "Self-Timer", + "value": "2/5/10-Second Delay" + }, + { + "group": "Still Image Capture", + "label": "Aspect Ratio", + "value": "1:1, 3:2, 4:3, 16:9" + }, + { + "group": "Still Image Capture", + "label": "Image File Format", + "value": "HEIF, JPEG, Raw" + }, + { + "group": "Still Image Capture", + "label": "Bit Depth", + "value": "14-Bit" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "XAVC HS 4:2:2 10-Bit | UHD 4K (3840 x 2160) at 23.98/50/59.94/100/120 fps [50 to 280 Mb/s] | XAVC HS 4:2:0 10-Bit | UHD 4K (3840 x 2160) at 23.98/50/59.94/100/120 fps [30 to 200 Mb/s] | XAVC S 4:2:2 10-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94/100/120 fps [100 to 280 Mb/s] | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps [50 Mb/s] | XAVC S 4:2:0 8-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94/100/120 fps [60 to 200 Mb/s] | 1920 x 1080 at 23.98/25/29.97/50/59.94/100/120 fps [16 to 100 Mb/s] | XAVC S-I 4:2:2 10-Bit | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94 fps [240 to 600 Mb/s] | 1920 x 1080 at 23.98/25/29.97/50/59.94 fps [89 to 222 Mb/s]" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "4:2:2 10-Bit via HDMI | UHD 4K (3840 x 2160) at 23.98/25/29.97/50/59.94 fps | HD (1920 x 1080) at 23.98/50/59.94 fps" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Yes" + }, + { + "group": "Video Capture", + "label": "Gamma Curve", + "value": "HDR-HLG, S Cinetone, Sony S-Log 3" + }, + { + "group": "Video Capture", + "label": "Recording Limit", + "value": "No" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "XAVC: 2-Channel 16-Bit 48 kHz LPCM Audio" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Single Slot: SD/SDHC/SDXC (UHS-II)" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Headphone Output | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x USB-C Data Output (Shared with Power Input)" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: Creators' App | Functionality: Access Stored Files, Remote Control" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "GPS | *Via Connected Smartphone" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Articulating 3\" Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "1,030,000 Dot" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Electronic (OLED)" + }, + { + "group": "Viewfinder", + "label": "Size", + "value": "0.39\"" + }, + { + "group": "Viewfinder", + "label": "Resolution", + "value": "2,359,296 Dot" + }, + { + "group": "Viewfinder", + "label": "Eye Point", + "value": "22 mm" + }, + { + "group": "Viewfinder", + "label": "Coverage", + "value": "100%" + }, + { + "group": "Viewfinder", + "label": "Magnification", + "value": "Approx. 1.07x" + }, + { + "group": "Viewfinder", + "label": "Diopter Adjustment", + "value": "-4 to +3" + }, + { + "group": "Focus", + "label": "Focus Type", + "value": "Auto and Manual Focus" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Automatic, Continuous-Servo AF, Direct Manual Focus, Manual Focus, Single-Servo AF" + }, + { + "group": "Focus", + "label": "Autofocus Points", + "value": "Photo | Phase Detection: 759 | Video | Phase Detection: 495" + }, + { + "group": "Focus", + "label": "Autofocus Sensitivity", + "value": "-3 to +20 EV" + }, + { + "group": "Flash", + "label": "Built-In Flash/Light", + "value": "No" + }, + { + "group": "Flash", + "label": "Maximum Sync Speed", + "value": "1/160 Second" + }, + { + "group": "Flash", + "label": "Flash Compensation", + "value": "-3 to +3 EV (1/3, 1/2 EV Steps)" + }, + { + "group": "Flash", + "label": "Dedicated Flash System", + "value": "TTL" + }, + { + "group": "Flash", + "label": "External Flash Connection", + "value": "Shoe Mount, Wireless" + }, + { + "group": "General", + "label": "Battery", + "value": "1x NP-FZ100 Rechargeable Lithium-Ion (Included) |  • Approx. 550 Shots" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Intelligent Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Materials", + "value": "Magnesium Alloy" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C" + }, + { + "group": "General", + "label": "Storage Conditions", + "value": "-4 to 131°F / -20 to 55°C" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "4.8 x 2.7 x 3\" / 122 x 69 x 75.1 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "0.9 lb / 411 g (Body Only) | 1.1 lb / 493 g (With Battery, Recording Media)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.585 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6 x 5.5 x 4.7\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1928285-REG/sony_a6700_mirrorless_camera_with.html", + "archive_url": "https://web.archive.org/web/20251204060753/https://www.bhphotovideo.com/c/product/1928285-REG/sony_a6700_mirrorless_camera_with.html", + "archive_timestamp": "20251204060753", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "canon-hg-100tbr-tripod-grip", + "name": "Canon HG-100TBR Tripod Grip", + "brand": "Canon", + "bh_sku": "CAHG100TBR", + "mpn": "4157C001", + "department_slug": "photography", + "subcategory_slug": "tripods-supports", + "product_type": "Tripod", + "price_usd": 129.0, + "availability": "In Stock", + "condition": "New", + "description": "Useful for stabilizing your shots, the HG-100TBR Tripod Grip is compatible with select Canon EOS R, EOS M, and PowerShot G cameras. Serving double duty, the HG-100TBR can be used either as a camera grip for handheld shooting or can fold out to a sleek tabletop tripod. The head has a tilting design for working at different angles and it attaches to cameras via a 1/4\"-20 mount. A BR-E1 Wireless Remote Control is also included, and fits into the grip's design, for wireless shooting and seamless camera control.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/cahg100tbr.jpg", + "image_sha256": "a7f22cd60a4837f1678d33b6a8912a40f633ec3952e34779e3d0f48015d109c4", + "specs": [ + { + "group": "Key Specs", + "label": "Primary Material", + "value": "Plastic" + }, + { + "group": "Key Specs", + "label": "Load Capacity", + "value": "2.2 lb / 1 kg" + }, + { + "group": "Key Specs", + "label": "Maximum Working Height", + "value": "Not Specified by Manufacturer" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "5.76 oz / 163 g" + }, + { + "group": "Head", + "label": "Camera / Device Mounting", + "value": "1/4\"-20 Screw (No Quick Release)" + }, + { + "group": "Head", + "label": "Head Type", + "value": "Tilt Head" + }, + { + "group": "Head", + "label": "Base Mount", + "value": "No" + }, + { + "group": "Pan & Tilt", + "label": "Lateral Tilt", + "value": "No" + }, + { + "group": "Legs", + "label": "Primary Material", + "value": "Plastic" + }, + { + "group": "Legs", + "label": "Foot Features", + "value": "Folds to Handgrip" + }, + { + "group": "General", + "label": "Load Capacity", + "value": "2.2 lb / 1 kg" + }, + { + "group": "General", + "label": "Maximum Working Height", + "value": "Not Specified by Manufacturer" + }, + { + "group": "General", + "label": "Closed Length", + "value": "7.5\" / 19.1 cm" + }, + { + "group": "General", + "label": "Includes Remote Trigger", + "value": "Yes: Wireless" + }, + { + "group": "General", + "label": "Weight", + "value": "5.76 oz / 163 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.625 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "9.5 x 3 x 2.75\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1512527-REG/canon_4157c001_hg_100tbr_tripod_grip.html", + "archive_url": "https://web.archive.org/web/20260222155554/https://www.bhphotovideo.com/c/product/1512527-REG/canon_4157c001_hg_100tbr_tripod_grip.html", + "archive_timestamp": "20260222155554", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "dji-rs-3-mini-gimbal-stabilizer-accessory-kit", + "name": "DJI RS 3 Mini Gimbal Stabilizer Accessory Kit", + "brand": "DJI", + "bh_sku": "DJRS3MPMK", + "mpn": null, + "department_slug": "photography", + "subcategory_slug": "tripods-supports", + "product_type": "Tripod", + "price_usd": 296.98, + "availability": "In Stock", + "condition": "New", + "description": "Extend your battery life when recording with your mirrorless camera using the DJI RS 3 Mini Gimbal Stabilizer Accessory Kit from B&H. The kit equips you with a lightweight single-handgrip gimbal stabilizer, a power bank, and a memory card to store your footage.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": "Bluetooth 5.1", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Gimbal Design", + "value": "Single Handgrip" + }, + { + "group": "Key Specs", + "label": "Load Capacity", + "value": "0.9 to 4.4 lb / 0.4 to 2 kg" + }, + { + "group": "Key Specs", + "label": "Number of Axes", + "value": "Three: Pitch (Tilt) / Roll / Yaw (Pan)" + }, + { + "group": "Key Specs", + "label": "Camera Control", + "value": "On Compatible Models" + }, + { + "group": "Key Specs", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS" + }, + { + "group": "Key Specs", + "label": "Display Type", + "value": "Fixed Touchscreen OLED" + }, + { + "group": "Key Specs", + "label": "Dimensions", + "value": "12.7 x 7.7 x 3.9\" / 323 x 195 x 98 mm" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "1.75 lb / 795.00 g" + }, + { + "group": "Gimbal", + "label": "Load Capacity", + "value": "0.9 to 4.4 lb / 0.4 to 2 kg" + }, + { + "group": "Gimbal", + "label": "Number of Axes", + "value": "Three: Pitch (Tilt) / Roll / Yaw (Pan)" + }, + { + "group": "Gimbal", + "label": "Rotation Range", + "value": "Mechanical Range | Roll: 335° (-95 to 240°)  | Pitch (Tilt): 320° (-110 to 210°)  | Yaw (Pan): 360° Unlimited" + }, + { + "group": "Gimbal", + "label": "Follow Speed", + "value": "Pan/Tilt/Roll: 360°/s" + }, + { + "group": "Gimbal", + "label": "Counterweight", + "value": "No" + }, + { + "group": "Gimbal", + "label": "Joystick Controller", + "value": "Yes (Included)" + }, + { + "group": "Compatibility", + "label": "Camera Control", + "value": "On Compatible Models" + }, + { + "group": "Compatibility", + "label": "Camera Mounting Screw", + "value": "1x 1/4\"-20 Male" + }, + { + "group": "Connectivity", + "label": "Inputs/Outputs", + "value": "1x USB-C (2 A 5 VDC Power)" + }, + { + "group": "Connectivity", + "label": "Wireless", + "value": "Bluetooth 5.1" + }, + { + "group": "Connectivity", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: RONIN" + }, + { + "group": "Battery", + "label": "Battery Type", + "value": "1x 18650" + }, + { + "group": "Battery", + "label": "Battery Runtime", + "value": "10 Hours" + }, + { + "group": "Battery", + "label": "Battery Charging Time", + "value": "2.5 Hours" + }, + { + "group": "Power", + "label": "Operating Voltage", + "value": "7.2 VDC" + }, + { + "group": "General", + "label": "Display Type", + "value": "Fixed Touchscreen OLED" + }, + { + "group": "General", + "label": "Operating Conditions", + "value": "14 to 113°F / -10 to 45°C" + }, + { + "group": "General", + "label": "Materials", + "value": "Aluminum Alloy" + }, + { + "group": "General", + "label": "Accessory Mounting", + "value": "1 x 1/4\"-20 Female | 1 x NATO Rail" + }, + { + "group": "General", + "label": "Dimensions", + "value": "12.7 x 7.7 x 3.9\" / 323 x 195 x 98 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "1.75 lb / 795.00 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "3.36 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "12.5 x 9.3 x 4.2\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1927367-REG/dji_rs_3_mini_gimbal.html", + "archive_url": "https://web.archive.org/web/20251215013900/https://www.bhphotovideo.com/c/product/1927367-REG/dji_rs_3_mini_gimbal.html", + "archive_timestamp": "20251215013900", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "hoodman-tripod-mount-for-dji-smart-controller", + "name": "Hoodman Tripod Mount for DJI Smart Controller", + "brand": "Hoodman", + "bh_sku": "HOHSCT", + "mpn": "HSCT", + "department_slug": "photography", + "subcategory_slug": "tripods-supports", + "product_type": "Tripod", + "price_usd": 29.99, + "availability": "In Stock", + "condition": "New", + "description": "Enjoy more stable and finessed piloting with this Tripod Mount for DJI Smart Controller from Hoodman. This black, powder-coated, steel mounting plate is engineered to screw into your DJI remote and any optional tripod with a 1/4\"-20 mounting hole. Once installed and mounted, you can pilot without needing to hold the remote. The tripod mount offers stability and consistent placement of the remote, letting you focus on complex aerial maneuvers.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/hohsct.jpg", + "image_sha256": "bb7efeac6aedbec9462f7b459d2b792225792249debbfac96cc3dc1b8d9fe491", + "specs": [ + { + "group": "Specifications", + "label": "Tripod Compatibility", + "value": "1/4\"-20" + }, + { + "group": "Specifications", + "label": "Construction Material", + "value": "Powder-Coated Steel" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.26 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7.8 x 5.2 x 1.7\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1512569-REG/hoodman_hsct_tripod_mount_for_dji.html", + "archive_url": "https://web.archive.org/web/20251016193230/https://www.bhphotovideo.com/c/product/1512569-REG/hoodman_hsct_tripod_mount_for_dji.html", + "archive_timestamp": "20251016193230", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "moment-tripod-mount-for-magsafe-landscape-portrait-tall", + "name": "Moment Tripod Mount for MagSafe (Landscape & Portrait, Tall)", + "brand": "Moment", + "bh_sku": "MOPTMMS", + "mpn": "107-016-M", + "department_slug": "photography", + "subcategory_slug": "tripods-supports", + "product_type": "Tripod", + "price_usd": 75.0, + "availability": "In Stock", + "condition": "New", + "description": "The lightweight aluminum Tripod Mount with MagSafe from Moment connects to any tripod or grip with a 1/4\"-20 threaded connection. Once attached, you can use the mount's built-in strong (M)Force magnet array to quickly click your MagSafe-compatible iPhone into place. The mount works with MagSafe-compatible cases and its surface is padded to prevent scratches when using an iPhone 12 outside of a case. This version of the Pro Mount supports both landscape and portrait orientations. It also features a cold shoe arm that's adjustable to accommodate any iPhone 12 model. Use the cold shoe for an (optional) LED light or microphone to elevate the quality of your content.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Specifications", + "label": "Device Mounting", + "value": "MagSafe-Compatible Magnetic Plate" + }, + { + "group": "Specifications", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female Thread" + }, + { + "group": "Specifications", + "label": "Accessory Mounting", + "value": "1x Cold Shoe" + }, + { + "group": "Specifications", + "label": "Adjustments", + "value": "Rotation" + }, + { + "group": "Specifications", + "label": "Self-Supporting", + "value": "No" + }, + { + "group": "Specifications", + "label": "Material", + "value": "Aluminum" + }, + { + "group": "Specifications", + "label": "Dimensions", + "value": "3 x 2.3 x 0.7\" / 7.7 x 5.8 x 1.7 cm | 5.7 x 2.3 x 1.1\" / 14.6 x 5.8 x 2.7 cm (with Arm)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.35 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.3 x 3.1 x 1.1\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1604350-REG/moment_107_016_m_pro_tripod_mount_for.html", + "archive_url": "https://web.archive.org/web/20251015175259/https://www.bhphotovideo.com/c/product/1604350-REG/moment_107_016_m_pro_tripod_mount_for.html", + "archive_timestamp": "20251015175259", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "oben-gh-30c-carbon-fiber-gimbal-head", + "name": "Oben GH-30C Carbon Fiber Gimbal Head", + "brand": "Oben", + "bh_sku": "OBGH30C", + "mpn": "GH-30C", + "department_slug": "photography", + "subcategory_slug": "tripods-supports", + "product_type": "Tripod", + "price_usd": 299.95, + "availability": "In Stock", + "condition": "New", + "description": "Featuring durable yet lightweight carbon fiber construction, the GH-30C Carbon Fiber Gimbal Head from Oben is designed to balance a lens and camera along its vertical and horizontal axes. Ideal for shooting moving subjects, such as birds, wildlife, and athletic events, the gimbal head ensures you can use your telephoto or zoom lens to quickly aim and shoot your subject. The unit's built-in fluid motion assures smooth and uniform panning. Unwieldy lenses that are normally too large or heavy to be moved and aimed quickly can be tilted or swiveled effortlessly, and large, easy-to-grip locking knobs and an Arca-type quick release plate allow for swift and secure lens mounting. The GH-30C mounts onto most tripods with a 3/8\"-16 threaded stud, and the strong and durable curved main arm supports and balances loads up to 44 lb, so even a large lens feels weightless.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/obgh30c.jpg", + "image_sha256": "60fca0956390849e51eef66122dd1743de66c8f4e522d8fed97f02cc4f01608d", + "specs": [ + { + "group": "Key Specs", + "label": "Camera Mounting", + "value": "Dual 1/4\"-20 Screws (Quick Release Plate: Arca-Type)" + }, + { + "group": "Key Specs", + "label": "Head Type", + "value": "Gimbal Head" + }, + { + "group": "Key Specs", + "label": "Drag Control", + "value": "Yes" + }, + { + "group": "Key Specs", + "label": "Load Capacity", + "value": "44 lb / 19.96 kg" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "2.7 lb / 1.22 kg" + }, + { + "group": "Head", + "label": "Camera Mounting", + "value": "Dual 1/4\"-20 Screws (Quick Release Plate: Arca-Type)" + }, + { + "group": "Head", + "label": "Head Type", + "value": "Gimbal Head" + }, + { + "group": "Head", + "label": "Base Mount", + "value": "Flat Base with 3/8\"-16 Female" + }, + { + "group": "Head", + "label": "Counter Balance", + "value": "No" + }, + { + "group": "Pan & Tilt", + "label": "Drag Control", + "value": "Yes" + }, + { + "group": "Pan & Tilt", + "label": "Independent Pan Lock", + "value": "Yes" + }, + { + "group": "General", + "label": "Load Capacity", + "value": "44 lb / 19.96 kg" + }, + { + "group": "General", + "label": "Bubble Level", + "value": "No" + }, + { + "group": "General", + "label": "Weight", + "value": "2.7 lb / 1.22 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "3.2 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "11.4 x 10.15 x 3.05\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1500226-REG/oben_gh_30c_carbon_fiber_gimbal.html", + "archive_url": "https://web.archive.org/web/20260710211006/https://www.bhphotovideo.com/c/product/1500226-REG/oben_gh_30c_carbon_fiber_gimbal.html", + "archive_timestamp": "20260710211006", + "fetched_at": "2026-09-12T17:27:26Z" + } + }, + { + "slug": "peak-design-pro-leveling-base-for-pro-tripod-legs", + "name": "Peak Design Pro Leveling Base for Pro Tripod Legs", + "brand": "Peak Design", + "bh_sku": "PEPTAUPLB", + "mpn": "PTA-U-PLB-1", + "department_slug": "photography", + "subcategory_slug": "tripods-supports", + "product_type": "Tripod", + "price_usd": 113.99, + "availability": "In Stock", + "condition": "New", + "description": "Achieve level camera positioning without individually adjusting tripod leg lengths using this Pro Leveling Base for Pro Tripod Legs from Peak Design. Sporting a 3/8\"-16 male screw mount for wide-ranging compatibility, this base allows Peak Design's Pro, Pro Lite, and Pro Tall tripod legs to be used with dedicated video heads or gimbals.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "General", + "label": "Compatibility", + "value": "Peak Design Pro Carbon Fiber Tripod / Pro Lite Carbon Fiber Tripod / Pro Tall Carbon Fiber Tripod" + }, + { + "group": "Physical", + "label": "Top Mount", + "value": "1x 3/8\"-16 Male Screw" + }, + { + "group": "Physical", + "label": "Bottom Mount", + "value": "1x Proprietary Tripod Mount" + }, + { + "group": "Physical", + "label": "Additional Mounting", + "value": "No" + }, + { + "group": "Physical", + "label": "Load Capacity", + "value": "40 lb / 18.1 kg" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black" + }, + { + "group": "Physical", + "label": "Material of Construction", + "value": "Aluminum" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.16 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.6 x 5.5 x 3.3\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1906571-REG/peak_design_pta_u_plb_1_pro_tripod_pro_leveling.html", + "archive_url": "https://web.archive.org/web/20251130045731/https://www.bhphotovideo.com/c/product/1906571-REG/peak_design_pta_u_plb_1_pro_tripod_pro_leveling.html", + "archive_timestamp": "20251130045731", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "peak-design-pro-lite-carbon-fiber-tripod-with-ball-head-black", + "name": "Peak Design Pro Lite Carbon Fiber Tripod with Ball Head (Black)", + "brand": "Peak Design", + "bh_sku": "PEPTLBK", + "mpn": "PT-L-BK-1", + "department_slug": "photography", + "subcategory_slug": "tripods-supports", + "product_type": "Tripod", + "price_usd": 799.95, + "availability": "In Stock", + "condition": "New", + "description": "Delivering a professional feature set in a portable package, the Pro Lite Carbon Fiber Tripod with Ball Head from Peak Design is the ideal tool for on-the-go photographers and videographers. The tripod's refined ball head features built-in 360° fluid panning with an independent lock and allows 90° tilting when the center column is raised. The quick-lock mounting system and included Arca-type quick release plate ensure rapid mounting and dismounting, while the integrated safety toggle maximizes camera security.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Camera Mounting", + "value": "1/4\"-20 Screw (Quick Release Plate: Arca-Type)" + }, + { + "group": "Key Specs", + "label": "Head Type", + "value": "Ball Head" + }, + { + "group": "Key Specs", + "label": "Drag Control", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Primary Material", + "value": "Carbon Fiber" + }, + { + "group": "Key Specs", + "label": "Load Capacity", + "value": "35 lb / 15.9 kg" + }, + { + "group": "Key Specs", + "label": "Maximum Working Height", + "value": "64\" / 162.6 cm" + }, + { + "group": "Key Specs", + "label": "Minimum Working Height", + "value": "6.2\" / 15.7 cm" + }, + { + "group": "Key Specs", + "label": "Closed Length", + "value": "19.2\" / 48.8 cm" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "3.7 lb / 1.7 kg" + }, + { + "group": "Head", + "label": "Camera Mounting", + "value": "1/4\"-20 Screw (Quick Release Plate: Arca-Type)" + }, + { + "group": "Head", + "label": "Head Type", + "value": "Ball Head" + }, + { + "group": "Pan & Tilt", + "label": "Drag Control", + "value": "No" + }, + { + "group": "Pan & Tilt", + "label": "Independent Pan Lock", + "value": "Yes" + }, + { + "group": "Pan & Tilt", + "label": "Independent Tilt Lock", + "value": "Yes" + }, + { + "group": "Pan & Tilt", + "label": "Vertical Tilt", + "value": "90°" + }, + { + "group": "Pan & Tilt", + "label": "Lateral Tilt", + "value": "No" + }, + { + "group": "Legs", + "label": "Primary Material", + "value": "Carbon Fiber" + }, + { + "group": "Legs", + "label": "Leg Lock", + "value": "Flip Lock" + }, + { + "group": "Legs", + "label": "Leg Sections", + "value": "4" + }, + { + "group": "Legs", + "label": "Independent Leg Spread", + "value": "Yes" + }, + { + "group": "General", + "label": "Load Capacity", + "value": "35 lb / 15.9 kg" + }, + { + "group": "General", + "label": "Maximum Working Height", + "value": "64\" / 162.6 cm" + }, + { + "group": "General", + "label": "Center Column", + "value": "Yes" + }, + { + "group": "General", + "label": "Max Height without Center Column", + "value": "52.5\" / 133.3 cm" + }, + { + "group": "General", + "label": "Minimum Working Height", + "value": "6.2\" / 15.7 cm" + }, + { + "group": "General", + "label": "Closed Length", + "value": "19.2\" / 48.8 cm" + }, + { + "group": "General", + "label": "Accessory Mounting", + "value": "No" + }, + { + "group": "General", + "label": "Bubble Level", + "value": "Yes" + }, + { + "group": "General", + "label": "Detachable Monopod", + "value": "No" + }, + { + "group": "General", + "label": "Weight", + "value": "3.7 lb / 1.7 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "5.285 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "21.4 x 6.4 x 4.8\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1906573-REG/peak_design_pt_l_bk_1_pro_lite_tripod_black.html", + "archive_url": "https://web.archive.org/web/20260130230633/https://www.bhphotovideo.com/c/product/1906573-REG/peak_design_pt_l_bk_1_pro_lite_tripod_black.html", + "archive_timestamp": "20260130230633", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "smallrig-carbon-fiber-monopod-lite-65-3", + "name": "SmallRig Carbon Fiber Monopod Lite (65.3\")", + "brand": "SmallRig", + "bh_sku": "SM5564", + "mpn": "5564", + "department_slug": "photography", + "subcategory_slug": "tripods-supports", + "product_type": "Tripod", + "price_usd": 199.99, + "availability": "In Stock", + "condition": "New", + "description": "Constructed from lightweight, durable carbon fiber, the SmallRig Carbon Fiber Photography Monopod is engineered for portability and stability. Ideal for fast-paced shoots or use in tight spaces, this monopod has a working height range of 26.8 to 65.3\". It can be quickly extended or retracted using a quick-deploy, one-touch lever. The monopod's angle can be adjusted using a knob at the head. The sturdy design supports up to 33 lb, ensuring your camera gear remains secure and steady during every session.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Camera Mounting", + "value": "1/4\"-20 Screw (No Quick Release)" + }, + { + "group": "Key Specs", + "label": "Head Type", + "value": "Ball Head" + }, + { + "group": "Key Specs", + "label": "Drag Control", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Primary Material", + "value": "Carbon Fiber" + }, + { + "group": "Key Specs", + "label": "Load Capacity", + "value": "24.3 lb / 11 kg" + }, + { + "group": "Key Specs", + "label": "Maximum Working Height", + "value": "65.6\" / 166.5 cm" + }, + { + "group": "Key Specs", + "label": "Closed Length", + "value": "26.8\" / 68 cm" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "3.8 lb / 1.7 kg" + }, + { + "group": "Head", + "label": "Camera Mounting", + "value": "1/4\"-20 Screw (No Quick Release)" + }, + { + "group": "Head", + "label": "Head Type", + "value": "Ball Head" + }, + { + "group": "Pan & Tilt", + "label": "Drag Control", + "value": "No" + }, + { + "group": "Pan & Tilt", + "label": "Independent Pan Lock", + "value": "Yes" + }, + { + "group": "Pan & Tilt", + "label": "Independent Tilt Lock", + "value": "Yes" + }, + { + "group": "Legs", + "label": "Primary Material", + "value": "Carbon Fiber" + }, + { + "group": "Legs", + "label": "Leg Lock", + "value": "Flip Lock" + }, + { + "group": "Legs", + "label": "Leg Sections", + "value": "4" + }, + { + "group": "Legs", + "label": "Foot Features", + "value": "Fold-out Footplate" + }, + { + "group": "General", + "label": "Load Capacity", + "value": "24.3 lb / 11 kg" + }, + { + "group": "General", + "label": "Maximum Working Height", + "value": "65.6\" / 166.5 cm" + }, + { + "group": "General", + "label": "Closed Length", + "value": "26.8\" / 68 cm" + }, + { + "group": "General", + "label": "Accessory Mounting", + "value": "1x 1/4\"-20 Female Thread | 1x ARRI Accessory Mount Female" + }, + { + "group": "General", + "label": "Bubble Level", + "value": "Yes" + }, + { + "group": "General", + "label": "Weight", + "value": "3.8 lb / 1.7 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "5.54 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "29 x 6.2 x 6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1927847-REG/smallrig_5564_carbon_fiber_photography_monopod.html", + "archive_url": "https://web.archive.org/web/20260808104523/https://www.bhphotovideo.com/c/product/1927847-REG/smallrig_5564_carbon_fiber_photography_monopod.html", + "archive_timestamp": "20260808104523", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "smallrig-carbon-fiber-monopod-pro-69", + "name": "SmallRig Carbon Fiber Monopod Pro (69\")", + "brand": "SmallRig", + "bh_sku": "SM5565", + "mpn": "5565", + "department_slug": "photography", + "subcategory_slug": "tripods-supports", + "product_type": "Tripod", + "price_usd": 399.99, + "availability": "In Stock", + "condition": "New", + "description": "Set up your camera support one-handed with the Carbon Fiber Monopod Pro from SmallRig. This four-section monopod extends from 30 to 69\" with the press of a button. The compact hydraulic head features a load capacity of approximately 11 lb and is compatible with DJI RS and Manfrotto quick release plates for quick camera transfers. Additional accessories can be attached through three 1/4\"-20 holes on the monopod.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Camera Mounting", + "value": "1/4\"-20 Screw (Quick Release Plate)" + }, + { + "group": "Key Specs", + "label": "Head Type", + "value": "Fluid Head" + }, + { + "group": "Key Specs", + "label": "Drag Control", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Primary Material", + "value": "Carbon Fiber" + }, + { + "group": "Key Specs", + "label": "Load Capacity", + "value": "11.02 lb / 5 kg" + }, + { + "group": "Key Specs", + "label": "Maximum Working Height", + "value": "68.9\" / 175 cm" + }, + { + "group": "Key Specs", + "label": "Closed Length", + "value": "29.9\" / 76 cm" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "5.51 lb / 2.5 kg" + }, + { + "group": "Head", + "label": "Camera Mounting", + "value": "1/4\"-20 Screw (Quick Release Plate)" + }, + { + "group": "Head", + "label": "Head Type", + "value": "Fluid Head" + }, + { + "group": "Head", + "label": "Base Mount", + "value": "Flat Base with 3/8\"-16 and 1/4\"-20 Female" + }, + { + "group": "Pan & Tilt", + "label": "Drag Control", + "value": "No" + }, + { + "group": "Legs", + "label": "Primary Material", + "value": "Carbon Fiber" + }, + { + "group": "Legs", + "label": "Leg Lock", + "value": "Flip Lock" + }, + { + "group": "Legs", + "label": "Leg Sections", + "value": "4" + }, + { + "group": "Legs", + "label": "Foot Features", + "value": "Fold-out Footplate" + }, + { + "group": "General", + "label": "Load Capacity", + "value": "11.02 lb / 5 kg" + }, + { + "group": "General", + "label": "Maximum Working Height", + "value": "68.9\" / 175 cm" + }, + { + "group": "General", + "label": "Closed Length", + "value": "29.9\" / 76 cm" + }, + { + "group": "General", + "label": "Accessory Mounting", + "value": "3x 1/4\"-20 Female Thread" + }, + { + "group": "General", + "label": "Bubble Level", + "value": "Yes" + }, + { + "group": "General", + "label": "Weight", + "value": "5.51 lb / 2.5 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "7.765 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "32.1 x 6.5 x 6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1930292-REG/smallrig_5565_carbon_fiber_video_monopod.html", + "archive_url": "https://web.archive.org/web/20260808104523/https://www.bhphotovideo.com/c/product/1930292-REG/smallrig_5565_carbon_fiber_video_monopod.html", + "archive_timestamp": "20260808104523", + "fetched_at": "2026-09-12T17:27:30Z" + } + }, + { + "slug": "sunpak-pocketpod-smartphone-tripod-blue", + "name": "Sunpak PocketPod Smartphone Tripod (Blue)", + "brand": "Sunpak", + "bh_sku": "SU620031BL", + "mpn": "620-031-BL", + "department_slug": "photography", + "subcategory_slug": "tripods-supports", + "product_type": "Tripod", + "price_usd": 7.95, + "availability": "In Stock", + "condition": "New", + "description": "Ensure your device is steady while capturing photos or videos using this Sunpak PocketPod Smartphone Tripod. It has a load capacity of 1 lb, working height of 3.85\", and folded length of 5.85\". Compact, lightweight, and portable, this tripod has a spring-loaded phone clamp that holds a phone 2.5 to 3.25\" wide and 0.55\" thick, horizontally or vertically. Nonslip feet ensure stability. When the rubberized legs are folded in, it can be used as a reliable handheld grip. Cushioning protects your phone from scratches.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Camera / Device Mounting", + "value": "1/4\"-20 Screw or Device Clamp with Additional 1/4\"-20 Thread (No Quick Release) | Compatible with Devices 2.5 to 3.5\" / 6 to 9 cm Wide" + }, + { + "group": "Key Specs", + "label": "Head Type", + "value": "Device Mounting Arm" + }, + { + "group": "Key Specs", + "label": "Drag Control", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Primary Material", + "value": "Plastic" + }, + { + "group": "Key Specs", + "label": "Load Capacity", + "value": "1 lb / 453.6 g" + }, + { + "group": "Key Specs", + "label": "Maximum Working Height", + "value": "3.85\" / 10 cm" + }, + { + "group": "Key Specs", + "label": "Closed Length", + "value": "5.85\" / 15 cm" + }, + { + "group": "Key Specs", + "label": "Weight", + "value": "3 oz / 85.1 g" + }, + { + "group": "Head", + "label": "Camera / Device Mounting", + "value": "1/4\"-20 Screw or Device Clamp with Additional 1/4\"-20 Thread (No Quick Release) | Compatible with Devices 2.5 to 3.5\" / 6 to 9 cm Wide" + }, + { + "group": "Head", + "label": "Head Type", + "value": "Device Mounting Arm" + }, + { + "group": "Head", + "label": "Base Mount", + "value": "None (Fixed Head)" + }, + { + "group": "Pan & Tilt", + "label": "Drag Control", + "value": "No" + }, + { + "group": "Pan & Tilt", + "label": "Independent Pan Lock", + "value": "No" + }, + { + "group": "Pan & Tilt", + "label": "Independent Tilt Lock", + "value": "No" + }, + { + "group": "Pan & Tilt", + "label": "Vertical Tilt", + "value": "No" + }, + { + "group": "Pan & Tilt", + "label": "Lateral Tilt", + "value": "No" + }, + { + "group": "Legs", + "label": "Primary Material", + "value": "Plastic" + }, + { + "group": "Legs", + "label": "Leg Lock", + "value": "No" + }, + { + "group": "Legs", + "label": "Leg Sections", + "value": "1" + }, + { + "group": "Legs", + "label": "Independent Leg Spread", + "value": "Yes" + }, + { + "group": "Legs", + "label": "Foot Features", + "value": "Folds to Handgrip" + }, + { + "group": "General", + "label": "Load Capacity", + "value": "1 lb / 453.6 g" + }, + { + "group": "General", + "label": "Maximum Working Height", + "value": "3.85\" / 10 cm" + }, + { + "group": "General", + "label": "Center Column", + "value": "No" + }, + { + "group": "General", + "label": "Closed Length", + "value": "5.85\" / 15 cm" + }, + { + "group": "General", + "label": "Accessory Mounting", + "value": "No" + }, + { + "group": "General", + "label": "Bubble Level", + "value": "No" + }, + { + "group": "General", + "label": "Weight", + "value": "3 oz / 85.1 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.25 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7 x 3.5 x 1.5\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1924863-REG/sunpak_620_031_bl_pocketpod_smartphone_tripod_blue.html", + "archive_url": "https://web.archive.org/web/20260815110501/https://www.bhphotovideo.com/c/product/1924863-REG/sunpak_620_031_bl_pocketpod_smartphone_tripod_blue.html", + "archive_timestamp": "20260815110501", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "art-hp-1-personal-in-ear-monitor-amplifier", + "name": "ART HP-1 Personal In-Ear Monitor Amplifier", + "brand": "ART", + "bh_sku": "ARHP1", + "mpn": "HP-1", + "department_slug": "pro-audio", + "subcategory_slug": "headphones", + "product_type": "Headphones", + "price_usd": 59.99, + "availability": "In Stock", + "condition": "New", + "description": "The ART HP-1 is an in-line headphone amp designed for use with in-ear monitors for musicians and performers during performance and rehearsal applications. The unit offers a locking XLR-1/4\" combo input and a 3.5mm output with a variable volume control knob. Connect the input to a mixer or similar audio device and connect the output to the in-ear monitors of your choice for dependable, high-quality monitoring on stage or in the studio.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Number of Headphone Channels", + "value": "Single Channel" + }, + { + "group": "Key Specs", + "label": "Recommended Headphone Impedance", + "value": "Not Specified by Manufacturer" + }, + { + "group": "Key Specs", + "label": "Headphone Output Power", + "value": "105 mW" + }, + { + "group": "Key Specs", + "label": "Analog Audio I/O", + "value": "1x Combo XLR-1/4\" 3-Pin Balanced/Unbalanced Input" + }, + { + "group": "Key Specs", + "label": "Power Requirements", + "value": "Battery" + }, + { + "group": "Key Specs", + "label": "Number of Headphone Channels", + "value": "Single Channel" + }, + { + "group": "Key Specs", + "label": "Recommended Headphone Impedance", + "value": "Not Specified by Manufacturer" + }, + { + "group": "Key Specs", + "label": "Headphone Output Power", + "value": "105 mW" + }, + { + "group": "Key Specs", + "label": "EQ", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Display", + "value": "No" + }, + { + "group": "Connectivity", + "label": "Analog Audio I/O", + "value": "1x Combo XLR-1/4\" 3-Pin Balanced/Unbalanced Input" + }, + { + "group": "Connectivity", + "label": "Digital Audio I/O", + "value": "No" + }, + { + "group": "Connectivity", + "label": "Network I/O", + "value": "No" + }, + { + "group": "Connectivity", + "label": "USB I/O", + "value": "No" + }, + { + "group": "Performance", + "label": "Gain/Trim Range", + "value": "+9 dB" + }, + { + "group": "Performance", + "label": "Maximum Input Level", + "value": "+6.6 dBu" + }, + { + "group": "Performance", + "label": "Impedance", + "value": "5 Kilohms" + }, + { + "group": "Performance", + "label": "THD", + "value": "≤ 0.02% (1 kHz, Typical)" + }, + { + "group": "Power", + "label": "Power Requirements", + "value": "Battery" + }, + { + "group": "Power", + "label": "Battery Type", + "value": "2x AA" + }, + { + "group": "Power", + "label": "Approximate Battery Life", + "value": "40 Hours" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "5.4 x 1.7 x 1.6\" / 137 x 43 x 40.6 mm" + }, + { + "group": "Physical", + "label": "Weight", + "value": "0.5 lb / 227.0 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.675 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7.4 x 3.2 x 2.1\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1706637-REG/art_hp_1_belt_worn_battery_powered_headphone.html", + "archive_url": "https://web.archive.org/web/20250317014711/https://www.bhphotovideo.com/c/product/1706637-REG/art_hp_1_belt_worn_battery_powered_headphone.html", + "archive_timestamp": "20250317014711", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "astell-kern-x-campfire-audio-pathfinder-hybrid-in-ear-monitors", + "name": "Astell & Kern x Campfire Audio Pathfinder Hybrid In-Ear Monitors", + "brand": "Astell & Kern", + "bh_sku": "ASPATHFINDER", + "mpn": "3PSP3200-CMBLN1", + "department_slug": "pro-audio", + "subcategory_slug": "headphones", + "product_type": "Headphones", + "price_usd": 1899.0, + "availability": "In Stock", + "condition": "New", + "description": "Audiophiles and music enthusiasts in search of in-ear monitors with the latest technology should look no further than the Astell & Kern Pathfinder, a hybrid design created in collaboration with Campfire Audio. The Pathfinder features dual-chamber balanced armature drivers from Knowles as well as new dual custom 10mm dynamic drivers.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Wearing Style", + "value": "Dual Wired Earbud" + }, + { + "group": "Key Specs", + "label": "Number of Drivers", + "value": "1 per Earpiece" + }, + { + "group": "Key Specs", + "label": "Impedance", + "value": "6.2 Ohms" + }, + { + "group": "Key Specs", + "label": "Active Noise Cancellation", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Built-In Mic", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Audio Connector", + "value": "1x 2.5 mm | 1x 1/8\" / 3.5 mm | 1x 4.4 mm" + }, + { + "group": "Key Specs", + "label": "Included Adapter", + "value": "No" + }, + { + "group": "Headphone", + "label": "Wearing Style", + "value": "Dual Wired Earbud" + }, + { + "group": "Headphone", + "label": "Earpiece Design", + "value": "In-Ear (Intra-Aural)" + }, + { + "group": "Headphone", + "label": "Open/Closed-Back", + "value": "Closed-Back" + }, + { + "group": "Headphone", + "label": "Sound Field", + "value": "Stereo" + }, + { + "group": "Headphone", + "label": "Number of Drivers", + "value": "1 per Earpiece" + }, + { + "group": "Headphone", + "label": "Driver Type", + "value": "Dynamic/Balanced Armature Hybrid" + }, + { + "group": "Headphone", + "label": "Driver Size", + "value": "0.4\" / 10 mm" + }, + { + "group": "Headphone", + "label": "Impedance", + "value": "6.2 Ohms" + }, + { + "group": "Headphone", + "label": "Active Noise Cancellation", + "value": "No" + }, + { + "group": "Headphone", + "label": "Volume Limiting / Child-Safe", + "value": "No" + }, + { + "group": "Headphone", + "label": "Built-In Controls", + "value": "No" + }, + { + "group": "Microphone", + "label": "Built-In Mic", + "value": "No" + }, + { + "group": "Connectivity", + "label": "Audio Connector", + "value": "1x 2.5 mm | 1x 1/8\" / 3.5 mm | 1x 4.4 mm" + }, + { + "group": "Connectivity", + "label": "Included Adapter", + "value": "No" + }, + { + "group": "Connectivity", + "label": "Cable Design", + "value": "Detachable / Straight" + }, + { + "group": "Connectivity", + "label": "Audio Connector to Earpiece", + "value": "MMCX" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black / Silver" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.4 x 4.7 x 3.9\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1705201-REG/astell_kern_3psp3200_cmbln1_pathfinder_headphones.html", + "archive_url": "https://web.archive.org/web/20251008075717/https://www.bhphotovideo.com/c/product/1705201-REG/astell_kern_3psp3200_cmbln1_pathfinder_headphones.html", + "archive_timestamp": "20251008075717", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "beats-by-dr-dre-beats-solo3-wireless-on-ear-headphones-matte-black-icon", + "name": "Beats by Dr. Dre Beats Solo3 Wireless On-Ear Headphones (Matte Black / Icon)", + "brand": "Beats by Dr. Dre", + "bh_sku": "BESOLO3WBLK", + "mpn": "MX432LL/A", + "department_slug": "pro-audio", + "subcategory_slug": "headphones", + "product_type": "Headphones", + "price_usd": 119.95, + "availability": "In Stock", + "condition": "New", + "description": "Comprising a pair of Bluetooth wireless on-ear headphones styled in matte black, the Beats by Dr. Dre Beats Solo3 can provide up to 40 hours off a single charge. In a pinch, you can charge their on-board lithium-ion battery for five minutes to give you three hours of playing time. They feature a durable and folding construction with cushioned, adjustable earcups designed for all-day listening.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": "Bluetooth", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Wearing Style", + "value": "Dual Ear with Headband | Foldable: Yes | Earpiece Swivel: No" + }, + { + "group": "Key Specs", + "label": "Earpiece Design", + "value": "On-Ear (Supra-Aural)" + }, + { + "group": "Key Specs", + "label": "Active Noise Cancellation", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Built-In Controls", + "value": "Yes (on Earpiece)" + }, + { + "group": "Key Specs", + "label": "Noise Cancelling Microphone", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Number of Voice Mics", + "value": "2 with Beamforming" + }, + { + "group": "Key Specs", + "label": "Runtime", + "value": "40 Hours" + }, + { + "group": "Headphone", + "label": "Wearing Style", + "value": "Dual Ear with Headband | Foldable: Yes | Earpiece Swivel: No" + }, + { + "group": "Headphone", + "label": "Earpiece Design", + "value": "On-Ear (Supra-Aural)" + }, + { + "group": "Headphone", + "label": "Open/Closed-Back", + "value": "Closed-Back" + }, + { + "group": "Headphone", + "label": "Sound Field", + "value": "Stereo" + }, + { + "group": "Headphone", + "label": "Number of Drivers", + "value": "1 per Earpiece" + }, + { + "group": "Headphone", + "label": "Driver Type", + "value": "Dynamic" + }, + { + "group": "Headphone", + "label": "Active Noise Cancellation", + "value": "No" + }, + { + "group": "Headphone", + "label": "Volume Limiting / Child-Safe", + "value": "No" + }, + { + "group": "Headphone", + "label": "Built-In Controls", + "value": "Yes (on Earpiece)" + }, + { + "group": "Microphone", + "label": "Built-In Mic", + "value": "Yes (on Earpiece)" + }, + { + "group": "Microphone", + "label": "Noise Cancelling Microphone", + "value": "No" + }, + { + "group": "Microphone", + "label": "Number of Voice Mics", + "value": "2 with Beamforming" + }, + { + "group": "Connectivity", + "label": "Wireless", + "value": "Bluetooth" + }, + { + "group": "Connectivity", + "label": "Audio Connector", + "value": "No Wired Audio Support" + }, + { + "group": "Battery", + "label": "Runtime", + "value": "40 Hours" + }, + { + "group": "Battery", + "label": "Quick Charging Times", + "value": "5 Minutes for 3 Hours" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion" + }, + { + "group": "Charging Case", + "label": "Charging Input", + "value": "Micro-USB" + }, + { + "group": "Charging Case", + "label": "Wireless Charging", + "value": "No" + }, + { + "group": "Physical", + "label": "Color", + "value": "Matte Black" + }, + { + "group": "Physical", + "label": "Environmental Resistance", + "value": "No" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "7.8\" / 19.8 cm" + }, + { + "group": "Physical", + "label": "Weight", + "value": "7.5 oz / 213 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.38 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7.5 x 5.2 x 3.8\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1512399-REG/beats_by_dr_dre_mx432ll_a_solo3_wireless_headphones.html", + "archive_url": "https://web.archive.org/web/20250806062757/https://www.bhphotovideo.com/c/product/1512399-REG/beats_by_dr_dre_mx432ll_a_solo3_wireless_headphones.html", + "archive_timestamp": "20250806062757", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "sennheiser-ie-600-in-ear-headphones", + "name": "Sennheiser IE 600 In-Ear Headphones", + "brand": "Sennheiser", + "bh_sku": "SEIE600", + "mpn": "508948", + "department_slug": "pro-audio", + "subcategory_slug": "headphones", + "product_type": "Headphones", + "price_usd": 599.95, + "availability": "In Stock", + "condition": "New", + "description": "Experience flawless, unadulterated, and clear sound reproduction with the Sennheiser IE 600 In-Ear Headphones, perfect for listening to music in any environment. Built on Sennheiser's groundbreaking TrueResponse technology with handpicked and matched, dynamic 7mm single drivers, the earphones are optimized to achieve the lowest possible distortion, while delivering an extra-wide frequency response from 4 Hz to 46.5 kHz. Dual-resonator chambers (D2CA) make the subtlest nuances of your sound audible by eliminating masking resonance, giving you an exquisitely neutral acoustic voicing with powerful, yet fast and accurate low-end response that bring you closer to your music. The drivers are enclosed in ZR01 amorphous zirconium housings, which ensure enhanced resilience and lasting great looks thanks to the glass-like atomic structure of amorphous metal. Cables are included for conventional 3.5mm devices, but you'll also find a 4.4mm balanced jack for hi-fi equipment. The IE600 are designed and engineered in Germany and made in Sennheiser's Audiophile Production facility in Ireland.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/seie600.jpg", + "image_sha256": "64242d6b11266a1c58f9615c6f71c58579ddcd83ca7e231f7ea20e1579503e19", + "specs": [ + { + "group": "Key Specs", + "label": "Wearing Style", + "value": "Dual Wired Earbud" + }, + { + "group": "Key Specs", + "label": "Number of Drivers", + "value": "1 per Earpiece" + }, + { + "group": "Key Specs", + "label": "Impedance", + "value": "18 Ohms" + }, + { + "group": "Key Specs", + "label": "Active Noise Cancellation", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Frequency Response", + "value": "4 Hz to 46.5 kHz" + }, + { + "group": "Key Specs", + "label": "Built-In Mic", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Audio Connector", + "value": "1x 1/8\" / 3.5 mm TRS | 1x 4.4 mm TRRRS" + }, + { + "group": "Key Specs", + "label": "Included Adapter", + "value": "No" + }, + { + "group": "Headphone", + "label": "Wearing Style", + "value": "Dual Wired Earbud" + }, + { + "group": "Headphone", + "label": "Earpiece Design", + "value": "In-Ear (Intra-Aural)" + }, + { + "group": "Headphone", + "label": "Open/Closed-Back", + "value": "Closed-Back" + }, + { + "group": "Headphone", + "label": "Sound Field", + "value": "Stereo" + }, + { + "group": "Headphone", + "label": "Number of Drivers", + "value": "1 per Earpiece" + }, + { + "group": "Headphone", + "label": "Driver Type", + "value": "Dynamic" + }, + { + "group": "Headphone", + "label": "Driver Size", + "value": "0.3\" / 7 mm" + }, + { + "group": "Headphone", + "label": "Impedance", + "value": "18 Ohms" + }, + { + "group": "Headphone", + "label": "Active Noise Cancellation", + "value": "No" + }, + { + "group": "Headphone", + "label": "Frequency Response", + "value": "4 Hz to 46.5 kHz" + }, + { + "group": "Headphone", + "label": "Maximum Sound Pressure Level (SPL)", + "value": "118 dB at 1 Vrms" + }, + { + "group": "Headphone", + "label": "Built-In Mic", + "value": "No" + }, + { + "group": "Connectivity", + "label": "Audio Connector", + "value": "1x 1/8\" / 3.5 mm TRS | 1x 4.4 mm TRRRS" + }, + { + "group": "Connectivity", + "label": "Included Adapter", + "value": "No" + }, + { + "group": "Connectivity", + "label": "Connector Plating", + "value": "Gold" + }, + { + "group": "Connectivity", + "label": "Cable Design", + "value": "Detachable / Straight" + }, + { + "group": "Connectivity", + "label": "Audio Connector to Earpiece", + "value": "MMCX" + }, + { + "group": "Connectivity", + "label": "Cable Length", + "value": "4.1' / 1.25 m" + }, + { + "group": "Physical", + "label": "Color", + "value": "Gray" + }, + { + "group": "Physical", + "label": "Weight", + "value": "0.2 oz / 6 g (Each, without Cable) | 0.8 oz / 23 g (with Cable)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.95 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "8.7 x 5 x 2.7\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1704075-REG/sennheiser_508948_ie_600_in_ear_headphones.html", + "archive_url": "https://web.archive.org/web/20250219162002/https://www.bhphotovideo.com/c/product/1704075-REG/sennheiser_508948_ie_600_in_ear_headphones.html", + "archive_timestamp": "20250219162002", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "vox-amplug-3-ac30-in-line-headphone-amplifier", + "name": "VOX amPlug 3 AC30 In-Line Headphone Amplifier", + "brand": "VOX", + "bh_sku": "VOAP3AC", + "mpn": "AP3AC", + "department_slug": "pro-audio", + "subcategory_slug": "headphones", + "product_type": "Headphones", + "price_usd": 49.99, + "availability": "In Stock", + "condition": "New", + "description": "Equipped to make your guitar practicing easier than ever, the amPlug 3 from VOX is the third generation of the celebrated compact amps. Sporting warm dual-channel analog circuitry based on the classic AC30 guitar amp, loads of accompaniment rhythms, and three expansive stereo FX, amPlug 3 is ready to rock.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/voap3ac.jpg", + "image_sha256": "c156e8379a176d9c2f876ea36f8e2bb9165ee2b3b761759fd635bd3e1ce93a61", + "specs": [ + { + "group": "Inputs/Outputs", + "label": "Audio I/O", + "value": "1x 1/4\" TS Hi-Z/Instrument Input (Male, Fixed) | 1x 1/8\" / 3.5 mm TRRS Aux Input/Output | 1x 1/8\" / 3.5 mm TRS Headphone Output" + }, + { + "group": "Power", + "label": "Power Source", + "value": "Battery (Included)" + }, + { + "group": "Power", + "label": "Battery Type", + "value": "2x AAA" + }, + { + "group": "Physical", + "label": "Mounting", + "value": "Side: 1x Plug-In Mount" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black / Brown" + }, + { + "group": "Physical", + "label": "Environmental Resistance", + "value": "No" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "3.4 x 1.5 x 1.3\" / 8.7 x 3.9 x 3.3 cm (Plug Retracted)" + }, + { + "group": "Physical", + "label": "Weight", + "value": "1.4 oz / 40 g (Excluding Batteries)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.23 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7.15 x 5.1 x 1.55\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1806393-REG/vox_ap3ac_headphone_amplifier_ac30.html", + "archive_url": "https://web.archive.org/web/20250407095035/https://www.bhphotovideo.com/c/product/1806393-REG/vox_ap3ac_headphone_amplifier_ac30.html", + "archive_timestamp": "20250407095035", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "vox-amplug-3-bass-in-line-headphone-amplifier", + "name": "VOX amPlug 3 Bass In-Line Headphone Amplifier", + "brand": "VOX", + "bh_sku": "VOAP3BA", + "mpn": "AP3BA", + "department_slug": "pro-audio", + "subcategory_slug": "headphones", + "product_type": "Headphones", + "price_usd": 49.99, + "availability": "In Stock", + "condition": "New", + "description": "Equipped to make your bass guitar practicing easier than ever, the amPlug 3 Bass from VOX is the third generation of the celebrated compact amps. Sporting warm, dual-channel analog circuitry based on a classic bass amp sound, plus loads of accompaniment rhythms and three expansive stereo FX, amPlug 3 is ready to rock.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/voap3ba.jpg", + "image_sha256": "f03e40f182dd3265044a093da1eb9acca8b6fa2565d0f302494dad6b42695310", + "specs": [ + { + "group": "Inputs/Outputs", + "label": "Audio I/O", + "value": "1x 1/4\" TS Hi-Z/Instrument Input (Male, Fixed) | 1x 1/8\" / 3.5 mm TRRS Aux Input/Output | 1x 1/8\" / 3.5 mm TRS Headphone Output" + }, + { + "group": "Power", + "label": "Power Source", + "value": "Battery (Included)" + }, + { + "group": "Power", + "label": "Battery Type", + "value": "2x AAA" + }, + { + "group": "Physical", + "label": "Mounting", + "value": "Side: 1x Plug-In Mount" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black / Blue" + }, + { + "group": "Physical", + "label": "Environmental Resistance", + "value": "No" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "3.4 x 1.5 x 1.3\" / 8.7 x 3.9 x 3.3 cm (Plug Retracted)" + }, + { + "group": "Physical", + "label": "Weight", + "value": "1.4 oz / 40 g (Excluding Batteries)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.23 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7.15 x 5.1 x 1.55\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1806394-REG/vox_ap3ba_headphone_amplifier_bass.html", + "archive_url": "https://web.archive.org/web/20250407094910/https://www.bhphotovideo.com/c/product/1806394-REG/vox_ap3ba_headphone_amplifier_bass.html", + "archive_timestamp": "20250407094910", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "vox-amplug-3-boutique-in-line-headphone-amplifier", + "name": "VOX amPlug 3 Boutique In-Line Headphone Amplifier", + "brand": "VOX", + "bh_sku": "VOAP3BQ", + "mpn": "AP3BQ", + "department_slug": "pro-audio", + "subcategory_slug": "headphones", + "product_type": "Headphones", + "price_usd": 49.99, + "availability": "In Stock", + "condition": "New", + "description": "Equipped to make your guitar practicing easier than ever, the amPlug 3 Boutique from VOX is the third generation of the celebrated compact amps. Sporting warm dual-channel analog circuitry based on a boutique amp with smooth overdrive, and loads of accompaniment rhythms plus three expansive stereo FX, amPlug 3 is ready to rock.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/voap3bq.jpg", + "image_sha256": "2e253ac3b889c5d36d5aa5b561d42f37a03f0392084eca0cca2813e761418a8f", + "specs": [ + { + "group": "Inputs/Outputs", + "label": "Audio I/O", + "value": "1x 1/4\" TS Hi-Z/Instrument Input (Male, Fixed) | 1x 1/8\" / 3.5 mm TRRS Aux Input/Output | 1x 1/8\" / 3.5 mm TRS Headphone Output" + }, + { + "group": "Power", + "label": "Power Source", + "value": "Battery (Included)" + }, + { + "group": "Power", + "label": "Battery Type", + "value": "2x AAA" + }, + { + "group": "Physical", + "label": "Mounting", + "value": "Side: 1x Plug-In Mount" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black / Tan/Beige" + }, + { + "group": "Physical", + "label": "Environmental Resistance", + "value": "No" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "3.4 x 1.5 x 1.3\" / 8.7 x 3.9 x 3.3 cm (Plug Retracted)" + }, + { + "group": "Physical", + "label": "Weight", + "value": "1.4 oz / 40 g (Excluding Batteries)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.23 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7.15 x 5.1 x 1.6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1806395-REG/vox_ap3bq_headphone_amplifier_boutique.html", + "archive_url": "https://web.archive.org/web/20250407095031/https://www.bhphotovideo.com/c/product/1806395-REG/vox_ap3bq_headphone_amplifier_boutique.html", + "archive_timestamp": "20250407095031", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "vox-amplug-3-high-gain-in-line-headphone-amplifier", + "name": "VOX amPlug 3 High-Gain In-Line Headphone Amplifier", + "brand": "VOX", + "bh_sku": "VOAP3HG", + "mpn": "AP3HG", + "department_slug": "pro-audio", + "subcategory_slug": "headphones", + "product_type": "Headphones", + "price_usd": 49.99, + "availability": "In Stock", + "condition": "New", + "description": "Equipped to make your guitar practicing easier than ever, the amPlug 3 High Gain from VOX is the third generation of the celebrated compact amps. Sporting warm, dual-channel analog circuitry based on a modern high-gain amp sound, plus loads of accompaniment rhythms and three expansive stereo FX, amPlug 3 is ready to rock.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/voap3hg.jpg", + "image_sha256": "1b0b9597e9e422c22516231ed38f1016a8dd53e9855fa5c5236112f3fbd31dae", + "specs": [ + { + "group": "Inputs/Outputs", + "label": "Audio I/O", + "value": "1x 1/4\" TS Hi-Z/Instrument Input (Male, Fixed) | 1x 1/8\" / 3.5 mm TRRS Aux Input/Output | 1x 1/8\" / 3.5 mm TRS Headphone Output" + }, + { + "group": "Power", + "label": "Power Source", + "value": "Battery (Included)" + }, + { + "group": "Power", + "label": "Battery Type", + "value": "2x AAA" + }, + { + "group": "Physical", + "label": "Mounting", + "value": "Side: 1x Plug-In Mount" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black / Silver" + }, + { + "group": "Physical", + "label": "Environmental Resistance", + "value": "No" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "3.4 x 1.5 x 1.3\" / 8.7 x 3.9 x 3.3 cm (Plug Retracted)" + }, + { + "group": "Physical", + "label": "Weight", + "value": "1.4 oz / 40 g (Excluding Batteries)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.23 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7.1 x 5.05 x 1.6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1806396-REG/vox_ap3hg_headphone_amplifier_high_gain.html", + "archive_url": "https://web.archive.org/web/20250407095024/https://www.bhphotovideo.com/c/product/1806396-REG/vox_ap3hg_headphone_amplifier_high_gain.html", + "archive_timestamp": "20250407095024", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "vox-amplug-3-modern-bass-in-line-headphone-amplifier", + "name": "VOX amPlug 3 Modern Bass In-Line Headphone Amplifier", + "brand": "VOX", + "bh_sku": "VOAP3MB", + "mpn": "AP3MB", + "department_slug": "pro-audio", + "subcategory_slug": "headphones", + "product_type": "Headphones", + "price_usd": 49.99, + "availability": "In Stock", + "condition": "New", + "description": "Equipped to make your bass guitar practicing easier than ever, the amPlug 3 Modern Bass from VOX is the third generation of the celebrated compact amps. Sporting warm dual-channel analog circuitry based on a modern bass amp sound, loads of accompaniment rhythms, and three expansive stereo FX, amPlug 3 is ready to rock.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/voap3mb.jpg", + "image_sha256": "e69fdd04c62ccf6835d4bca47d99aa0f056d7aae05dda52ed94ac7fb1222f839", + "specs": [ + { + "group": "Inputs/Outputs", + "label": "Audio I/O", + "value": "1x 1/4\" TS Hi-Z/Instrument Input (Male, Fixed) | 1x 1/8\" / 3.5 mm TRRS Aux Input/Output | 1x 1/8\" / 3.5 mm TRS Headphone Output" + }, + { + "group": "Power", + "label": "Power Source", + "value": "Battery (Included)" + }, + { + "group": "Power", + "label": "Battery Type", + "value": "2x AAA" + }, + { + "group": "Physical", + "label": "Mounting", + "value": "Side: 1x Plug-In Mount" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black / Blue" + }, + { + "group": "Physical", + "label": "Environmental Resistance", + "value": "No" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "3.4 x 1.5 x 1.3\" / 8.7 x 3.9 x 3.3 cm (Plug Retracted)" + }, + { + "group": "Physical", + "label": "Weight", + "value": "1.4 oz / 40 g (Excluding Batteries)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.225 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7.15 x 5.1 x 1.55\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1806397-REG/vox_ap3mb_headphone_amplifier_modern_bass.html", + "archive_url": "https://web.archive.org/web/20250321001533/https://www.bhphotovideo.com/c/product/1806397-REG/vox_ap3mb_headphone_amplifier_modern_bass.html", + "archive_timestamp": "20250321001533", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "vox-amplug-3-uk-drive-in-line-headphone-amplifier", + "name": "VOX amPlug 3 UK Drive In-Line Headphone Amplifier", + "brand": "VOX", + "bh_sku": "VOAP3UD", + "mpn": "AP3UD", + "department_slug": "pro-audio", + "subcategory_slug": "headphones", + "product_type": "Headphones", + "price_usd": 49.99, + "availability": "In Stock", + "condition": "New", + "description": "Equipped to make your guitar practicing easier than ever, the amPlug 3 UK Drive from VOX is the third generation of the celebrated compact amps. Sporting warm, dual-channel analog circuitry based on the sound of a UK 100W stack amp, plus loads of accompaniment rhythms, and three expansive stereo FX, amPlug 3 is ready to rock.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/voap3ud.jpg", + "image_sha256": "65908830b46b6f7dce3e2898acd1fec41fa6ee62b04cc12d705e2295634070cd", + "specs": [ + { + "group": "Inputs/Outputs", + "label": "Audio I/O", + "value": "1x 1/4\" TS Hi-Z/Instrument Input (Male, Fixed) | 1x 1/8\" / 3.5 mm TRRS Aux Input/Output | 1x 1/8\" / 3.5 mm TRS Headphone Output" + }, + { + "group": "Power", + "label": "Power Source", + "value": "Battery (Included)" + }, + { + "group": "Power", + "label": "Battery Type", + "value": "2x AAA" + }, + { + "group": "Physical", + "label": "Mounting", + "value": "Side: 1x Plug-In Mount" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black / Brown" + }, + { + "group": "Physical", + "label": "Environmental Resistance", + "value": "No" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "3.4 x 1.5 x 1.3\" / 8.7 x 3.9 x 3.3 cm (Plug Retracted)" + }, + { + "group": "Physical", + "label": "Weight", + "value": "1.4 oz / 40 g (Excluding Batteries)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.23 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7.15 x 5.1 x 1.6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1806398-REG/vox_ap3ud_headphone_amplifier_uk_drive.html", + "archive_url": "https://web.archive.org/web/20250407095022/https://www.bhphotovideo.com/c/product/1806398-REG/vox_ap3ud_headphone_amplifier_uk_drive.html", + "archive_timestamp": "20250407095022", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "vox-amplug-3-us-silver-in-line-headphone-amplifier", + "name": "VOX amPlug 3 US Silver In-Line Headphone Amplifier", + "brand": "VOX", + "bh_sku": "VOAP3US", + "mpn": "AP3US", + "department_slug": "pro-audio", + "subcategory_slug": "headphones", + "product_type": "Headphones", + "price_usd": 49.99, + "availability": "In Stock", + "condition": "New", + "description": "Equipped to make your guitar practicing easier than ever, the amPlug 3 US Silver from VOX is the third generation of the celebrated compact amps. Sporting warm dual-channel analog circuitry based on a classic US combo amp sound, with loads of accompaniment rhythms and three expansive stereo FX, amPlug 3 is ready to rock.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/voap3us.jpg", + "image_sha256": "8f8392aa41f55561220db24bf1f2b5ac2a1bed1cb5144f6250c220314a83337b", + "specs": [ + { + "group": "Inputs/Outputs", + "label": "Audio I/O", + "value": "1x 1/4\" TS Hi-Z/Instrument Input (Male, Fixed) | 1x 1/8\" / 3.5 mm TRRS Aux Input/Output | 1x 1/8\" / 3.5 mm TRS Headphone Output" + }, + { + "group": "Power", + "label": "Power Source", + "value": "Battery (Included)" + }, + { + "group": "Power", + "label": "Battery Type", + "value": "2x AAA" + }, + { + "group": "Physical", + "label": "Mounting", + "value": "Side: 1x Plug-In Mount" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black / Silver" + }, + { + "group": "Physical", + "label": "Environmental Resistance", + "value": "No" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "3.4 x 1.5 x 1.3\" / 8.7 x 3.9 x 3.3 cm (Plug Retracted)" + }, + { + "group": "Physical", + "label": "Weight", + "value": "1.4 oz / 40 g (Excluding Batteries)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.23 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7.15 x 5.1 x 1.55\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1806399-REG/vox_ap3us_headphone_amplifier_us_silver.html", + "archive_url": "https://web.archive.org/web/20250407094910/https://www.bhphotovideo.com/c/product/1806399-REG/vox_ap3us_headphone_amplifier_us_silver.html", + "archive_timestamp": "20250407094910", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "ambient-recording-hha-sh58-handheld-microphone-adapter-for-shure-sm58-beta-58a-capsule-to-sennheiser-handheld", + "name": "Ambient Recording HHA-SH58 Handheld Microphone Adapter for Shure SM58 & Beta 58A Capsule to Sennheiser Handheld", + "brand": "Ambient Recording", + "bh_sku": "AMHHASH58", + "mpn": "HHA-SH58", + "department_slug": "pro-audio", + "subcategory_slug": "microphones", + "product_type": "Microphone", + "price_usd": 185.0, + "availability": "In Stock", + "condition": "New", + "description": "The Ambient Recording HHA-SH58 is a handheld microphone adapter designed to allow mounting of Shure SM58 and Beta 58A microphone heads onto compatible Sennheiser wireless handheld transmitters, enabling you to match your favorite mic capsule with your preferred wireless system for enhanced sonic performance. The HHA-SH58 offers compatibility with Sennheiser Evolution/2000/9000 Series (SKM 2000, SKM 100, SKM 300, SKM 500, SKM 6000, SKM 9000, SKM(-S) D1, EW-D SKM-S, and EW-DX SKM-S) handheld transmitters. It features durable anodized aluminum construction and gold-plated contacts.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/amhhash58.jpg", + "image_sha256": "979d4ea042961411a8270d12407f4cf4ba7aae50bf324f4a6a62b4903e64d749", + "specs": [ + { + "group": "General", + "label": "Compatibility", + "value": "Shure SM58 / Beta 58A | Sennheiser SKM2000 / SKM100 G3/G4 / SKM300 G3/G4 / SKM500 G3/G4 / SKM6000 / SKM9000 / SKM(-S) D1 / EW-D SKM-S / EW-DX SKM-S" + }, + { + "group": "Inputs/Outputs", + "label": "Connector 1", + "value": "1x Proprietary" + }, + { + "group": "Inputs/Outputs", + "label": "Connector 2", + "value": "1x Proprietary" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black" + }, + { + "group": "Physical", + "label": "Material of Construction", + "value": "Anodized Aluminum" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.125 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "2.45 x 2.25 x 2.15\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1915440-REG/ambient_recording_hha_sh58_handheld_microphone_adapter.html", + "archive_url": "https://web.archive.org/web/20260531032010/https://www.bhphotovideo.com/c/product/1915440-REG/ambient_recording_hha_sh58_handheld_microphone_adapter.html", + "archive_timestamp": "20260531032010", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "dji-mic-2-clip-on-transmitter-recorder-with-built-in-microphone-2-4-ghz-pearl-white", + "name": "DJI Mic 2 Clip-On Transmitter/Recorder with Built-In Microphone (2.4 GHz, Pearl White)", + "brand": "DJI", + "bh_sku": "DJMIC21TXPW", + "mpn": "CP.RN.00000329.01", + "department_slug": "pro-audio", + "subcategory_slug": "microphones", + "product_type": "Microphone", + "price_usd": 65.0, + "availability": "In Stock", + "condition": "New", + "description": "The DJI Mic 2 Clip-On Transmitter/Recorder is a white transmitter with both built-in microphone and onboard recording capabilities for seamless audio recording. Use in tandem with a separately available receiver, expand your preexisting Mic 2 wireless system, or connect to a mobile device/Osmo series camera via Bluetooth. The transmitter utilizes both 2.4 GHz digital and Bluetooth technology to communicate with the dual-channel receiver or even your DJI Osmo Pocket 3 or Action 4 camera from up to 820' away.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Wireless Technology", + "value": "Digital 2.4 GHz / Bluetooth" + }, + { + "group": "Key Specs", + "label": "Diversity", + "value": "Non-Diversity" + }, + { + "group": "Key Specs", + "label": "Max Operating Range", + "value": "820.2' / 250 m" + }, + { + "group": "Key Specs", + "label": "Included Transmitters", + "value": "1x Clip-On" + }, + { + "group": "Key Specs", + "label": "Microphone Type", + "value": "1x Built-In (Clip-On Transmitter)" + }, + { + "group": "System", + "label": "Wireless Technology", + "value": "Digital 2.4 GHz / Bluetooth" + }, + { + "group": "System", + "label": "Diversity", + "value": "Non-Diversity" + }, + { + "group": "System", + "label": "RF Channel Scanning", + "value": "Auto-Scan" + }, + { + "group": "System", + "label": "Max Operating Range", + "value": "820.2' / 250 m" + }, + { + "group": "System", + "label": "Max Transmitters per Band", + "value": "2" + }, + { + "group": "System", + "label": "Encryption", + "value": "No" + }, + { + "group": "System", + "label": "Built-In Recorder", + "value": "Yes (on Transmitter)" + }, + { + "group": "System", + "label": "Timecode Support", + "value": "Yes" + }, + { + "group": "System", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: DJI Mimo" + }, + { + "group": "Transmitters", + "label": "Included Transmitters", + "value": "1x Clip-On" + }, + { + "group": "Transmitters", + "label": "Antenna", + "value": "Internal" + }, + { + "group": "Transmitters", + "label": "Input Level", + "value": "Microphone" + }, + { + "group": "Transmitters", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Female Input" + }, + { + "group": "Transmitters", + "label": "USB I/O", + "value": "1x USB-C" + }, + { + "group": "Transmitters", + "label": "Muting", + "value": "No" + }, + { + "group": "Transmitters", + "label": "Auto-Level/Gain", + "value": "No" + }, + { + "group": "Transmitters", + "label": "Frequency Response", + "value": "50 Hz to 20 kHz | 100 Hz to 20 kHz" + }, + { + "group": "Transmitters", + "label": "Sync Method", + "value": "2.4 GHz QPSK" + }, + { + "group": "Transmitters", + "label": "Display", + "value": "Single-LED Indicators Only" + }, + { + "group": "Microphones", + "label": "Microphone Type", + "value": "1x Built-In (Clip-On Transmitter)" + }, + { + "group": "Microphones", + "label": "Polar Pattern", + "value": "Omnidirectional" + }, + { + "group": "Microphones", + "label": "Frequency Response", + "value": "100 Hz to 20 kHz (Low Cut Off) | 50 Hz to 20 kHz (Low Cut On)" + }, + { + "group": "Microphones", + "label": "Maximum SPL", + "value": "120 dB" + }, + { + "group": "Microphones", + "label": "Color", + "value": "White" + }, + { + "group": "Power", + "label": "Transmitter Battery Type", + "value": "1x Built-In Rechargeable - 360 mAh" + }, + { + "group": "Power", + "label": "Transmitter Battery Life", + "value": "6 Hours" + }, + { + "group": "Power", + "label": "Battery Charging Time", + "value": "70 Minutes" + }, + { + "group": "Power", + "label": "AC/DC Power Adapter", + "value": "No" + }, + { + "group": "Physical", + "label": "Environmental Resistance", + "value": "No" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "1.8 x 1.2 x 0.9\" / 45.7 x 30.5 x 22.9 mm" + }, + { + "group": "Physical", + "label": "Weight", + "value": "1 oz / 28 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.315 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "4.9 x 4.6 x 1.7\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1800668-REG/dji_cp_rn_00000329_01_dji_mic_2_1.html", + "archive_url": "https://web.archive.org/web/20251102134938/https://www.bhphotovideo.com/c/product/1800668-REG/dji_cp_rn_00000329_01_dji_mic_2_1.html", + "archive_timestamp": "20251102134938", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "deity-microphones-tc-1-wireless-timecode-generator-box-bluetooth-2-4-ghz", + "name": "Deity Microphones TC-1 Wireless Timecode Generator Box (Bluetooth, 2.4 GHz)", + "brand": "Deity Microphones", + "bh_sku": "DEDTT0272D80", + "mpn": "DTT0272D80", + "department_slug": "pro-audio", + "subcategory_slug": "microphones", + "product_type": "Microphone", + "price_usd": 159.0, + "availability": "In Stock", + "condition": "New", + "description": "Serious content creators can make post-production simpler, faster, and more cost-effective by adding timecode to their multicamera-shoot workflow with the Deity Microphones TC-1, a professional wireless timecode generator housed in an ultraportable little box. Recording timecode to all your cameras and audio recorders using TC-1 boxes that are synchronized (jam synched) ensures that sound and picture from every source automatically fall right into place in post. This high-quality generator boasts an ultralow drift rate of only one frame every 72 hours, enabling your footage and audio to remain tightly locked over the course of the day—whether shooting with a Sound Devices or Zoom recorder, or a DSLR/mirrorless or ARRI camera.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": "Bluetooth", + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/dedtt0272d80.jpg", + "image_sha256": "2dae1b529e54fd3ed321af28b9c8f42655b55d07912d012391a44ba920047899", + "specs": [ + { + "group": "General", + "label": "Timecode", + "value": "SMPTE, High Frame Rates" + }, + { + "group": "General", + "label": "Frame Rate", + "value": "23.98, 24, 25, 29.97, 29.97DF, 30, 50, 60 fps" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "OLED" + }, + { + "group": "Display", + "label": "Display Size", + "value": "1\"" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "No" + }, + { + "group": "Inputs/Outputs", + "label": "USB I/O", + "value": "1 x USB-C Female Input" + }, + { + "group": "Wireless", + "label": "Wireless", + "value": "Bluetooth" + }, + { + "group": "Wireless", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: Sidus Audio Mobile" + }, + { + "group": "Battery", + "label": "Battery Chemistry", + "value": "Lithium-Ion Polymer (LiPo)" + }, + { + "group": "Battery", + "label": "Battery Capacity", + "value": "950 mAh" + }, + { + "group": "Battery", + "label": "Recharge Time", + "value": "2 Hours" + }, + { + "group": "Battery", + "label": "Maximum Battery Life", + "value": "28 Hours" + }, + { + "group": "Physical", + "label": "Mounting", + "value": "1x Shoe Mount | 1x Hook-and-Loop" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black" + }, + { + "group": "Physical", + "label": "Operating Conditions", + "value": "-4 to 113°F / -20 to 45°C" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "2.1 x 1.6 x 0.9\" / 53.4 x 40 x 21.8 mm" + }, + { + "group": "Physical", + "label": "Weight", + "value": "1.4 oz / 41 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.57 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.1 x 5.3 x 1.8\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1705805-REG/deity_microphones_dtt0272d80_tc_1.html", + "archive_url": "https://web.archive.org/web/20251130234320/https://www.bhphotovideo.com/c/product/1705805-REG/deity_microphones_dtt0272d80_tc_1.html", + "archive_timestamp": "20251130234320", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "film-devices-microphone-travel-boompole-kit-carbon-fiber", + "name": "Film Devices Microphone Travel Boompole Kit (Carbon Fiber)", + "brand": "Film Devices", + "bh_sku": "FIBPK102CF", + "mpn": "BPK-102-CF", + "department_slug": "pro-audio", + "subcategory_slug": "microphones", + "product_type": "Microphone", + "price_usd": 199.0, + "availability": "In Stock", + "condition": "New", + "description": "The Film Devices Microphone Travel Boompole Kit is designed to give traveling on-location recordists everything they need to hold up a boom mic on the go. Made of durable carbon fiber, the pole is lightweight at 1.3 lb. It collapses down to 20\", so it will fit in carry-on luggage with ease.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/fibpk102cf.jpg", + "image_sha256": "7786f4e3c444d1e219fe767cf1475ea594a52e7b9103b146c4e8b8ee6d93bb72", + "specs": [ + { + "group": "Specifications", + "label": "Maximum Length", + "value": "67\" / 170.2 cm" + }, + { + "group": "Specifications", + "label": "Minimum Length", + "value": "20\" / 50.8 cm" + }, + { + "group": "Specifications", + "label": "Material", + "value": "Carbon Fiber" + }, + { + "group": "Specifications", + "label": "Thread Type", + "value": "1/4\"-20 Male with 3/8\"-16 Male Adapter" + }, + { + "group": "Specifications", + "label": "Top", + "value": "Removable" + }, + { + "group": "Specifications", + "label": "Weight", + "value": "1.35 lb / 0.61 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.15 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "24.5 x 4.5 x 4.5\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1606651-REG/film_devices_bpk_102_cf_microphone_travel_boom_pole.html", + "archive_url": "https://web.archive.org/web/20260212084502/https://www.bhphotovideo.com/c/product/1606651-REG/film_devices_bpk_102_cf_microphone_travel_boom_pole.html", + "archive_timestamp": "20260212084502", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "gator-frameworks-adjustable-angle-16-clamp-on-mini-boom", + "name": "Gator Frameworks Adjustable Angle 16\" Clamp-On Mini Boom", + "brand": "Gator", + "bh_sku": "GAWMICCLMP16", + "mpn": "GFW-MIC-CLMPBM16", + "department_slug": "pro-audio", + "subcategory_slug": "microphones", + "product_type": "Microphone", + "price_usd": 32.99, + "availability": "In Stock", + "condition": "New", + "description": "The Gator Cases Frameworks Adjustable Angle 16\" Clamp-On Mini Boom is designed to provide extended length and easy mic placement in tight spaces. It quickly attaches to any mic stand with a tube diameter of 0.6 to 0.9\" and gives you 9 to 16\" of reach once it is affixed.The boom angle adjustment clamp offers 270° of rotation for precise positioning. Thanks to the interconnecting teeth of the boom's rotational device, you'll be able to angle the boom securely. At the end of the boom sits a 5/8\"-27 thread that's compatible with most microphone clips and shockmounts.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Specifications", + "label": "Clamps to Stand Diameter", + "value": "0.6 to 0.9\" / 1.5 to 2.2 cm" + }, + { + "group": "Specifications", + "label": "Load Capacity", + "value": "3 lb / 1.4 kg" + }, + { + "group": "Specifications", + "label": "Boom Length", + "value": "9 to 16\" / 22.9 to 40.6 cm" + }, + { + "group": "Specifications", + "label": "Range of Motion", + "value": "270°" + }, + { + "group": "Specifications", + "label": "Mounting Thread", + "value": "5/8\"-27 Male" + }, + { + "group": "Specifications", + "label": "Dimensions", + "value": "1.5 x 3.5\" / 3.8 x 8.9 cm" + }, + { + "group": "Specifications", + "label": "Weight", + "value": "0.8 lb / 0.4 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.895 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "13.8 x 4.9 x 3.05\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1501360-REG/gator_cases_gfw_mic_clmpbm16_frameworks_adjustable_angle_16_clamp_on.html", + "archive_url": "https://web.archive.org/web/20251014112521/https://www.bhphotovideo.com/c/product/1501360-REG/gator_cases_gfw_mic_clmpbm16_frameworks_adjustable_angle_16_clamp_on.html", + "archive_timestamp": "20251014112521", + "fetched_at": "2026-09-12T17:27:30Z" + } + }, + { + "slug": "isovox-horizontal-mic-mount-for-vocal-isolation-booth", + "name": "ISOVOX Horizontal Mic Mount for Vocal Isolation Booth", + "brand": "ISOVOX", + "bh_sku": "ISHMM", + "mpn": "HORIZONTAL MIC MOUNT", + "department_slug": "pro-audio", + "subcategory_slug": "microphones", + "product_type": "Microphone", + "price_usd": 69.0, + "availability": "In Stock", + "condition": "New", + "description": "Mount and accurately position your microphone inside the ISOVOX Vocal Isolation Booth with the ISOVOX Horizontal Mic Mount. This mount is compatible with most front-address microphones such as Shure SM7B, Electro-Voice RE20, and other broadcast, shotgun, and handheld-style mics with a length that doesn't exceed 9.45\". You can mount your microphone upright or hanging upside down. The mount terminates with a 3/8\"-16 male thread to connect to your mic clip.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/ishmm.jpg", + "image_sha256": "6662493e97e45b4508393be890eaa4a32974f9d121cadf803b39b95df4653d04", + "specs": [ + { + "group": "Specifications", + "label": "Material of Construction", + "value": "Stainless Steel" + }, + { + "group": "Specifications", + "label": "Dimensions", + "value": "Extension Pole Length: 5.9\" / 150 mm | \nBracket Length: 5.9\" / 150 mm" + }, + { + "group": "Specifications", + "label": "Weight", + "value": "0.45 lb / 206 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.63 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "7.5 x 4.8 x 1.6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1705753-REG/isovox_horizontal_mic_mount.html", + "archive_url": "https://web.archive.org/web/20260222180039/https://www.bhphotovideo.com/c/product/1705753-REG/isovox_horizontal_mic_mount.html", + "archive_timestamp": "20260222180039", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "icon-pro-audio-ufo-tube-microphone-preamplifier", + "name": "Icon Pro Audio UFO Tube Microphone Preamplifier", + "brand": "Icon Pro Audio", + "bh_sku": "ICUFO", + "mpn": "UFO", + "department_slug": "pro-audio", + "subcategory_slug": "microphones", + "product_type": "Microphone", + "price_usd": 349.0, + "availability": "In Stock", + "condition": "New", + "description": "Marrying vintage analog tone with modern design, the Icon Pro Audio UFO is a discrete, Class-A tube mic preamp with a modular tube design that allows you to easily swap out the tube with an alternative for different tonal characters. With up to 68 dB of clean gain and extremely low noise, this mic preamp provides precise sound quality and a large dynamic range.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Inputs/Outputs", + "label": "Audio I/O", + "value": "1x XLR 3-Pin Mic Input | 1x 1/4\" TS Hi-Z/Instrument Input | 1x XLR 3-Pin Line Output" + }, + { + "group": "Power", + "label": "Power Source", + "value": "AC Adapter with Power Brick (Included)" + }, + { + "group": "Power", + "label": "DC Input Power", + "value": "10 to 54 VDC" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black" + }, + { + "group": "Physical", + "label": "Material of Construction", + "value": "Metal" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "8 x 7.8 x 4.5\" / 20.3 x 19.7 x 11.5 cm" + }, + { + "group": "Physical", + "label": "Weight", + "value": "2.98 lb / 1.35 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "9.305 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "14.7 x 10.5 x 6.9\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1911742-REG/icon_pro_audio_ufo_tube_microphone_preamplifier.html", + "archive_url": "https://web.archive.org/web/20251119124310/https://www.bhphotovideo.com/c/product/1911742-REG/icon_pro_audio_ufo_tube_microphone_preamplifier.html", + "archive_timestamp": "20251119124310", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "insta360-mic-air-wireless-transmitter-2-4-ghz", + "name": "Insta360 Mic Air Wireless Transmitter (2.4 GHz)", + "brand": "Insta360", + "bh_sku": "INCINSABWB", + "mpn": "CINSABWB", + "department_slug": "pro-audio", + "subcategory_slug": "microphones", + "product_type": "Microphone", + "price_usd": 49.99, + "availability": "In Stock", + "condition": "New", + "description": "Ideal for solo content creation and vlogging applications, the Insta360 Mic Air Transmitter is a highly compact and lightweight 2.4 GHz wireless transmitter (receiver not included) designed to connect directly with the X5 and Ace Pro 2 cameras. At a featherlight 7.9g and sporting a tiny coin-shaped frame, this mic/transmitter is discreet and ergonomically versatile.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/incinsabwb.jpg", + "image_sha256": "dd8c563c717c2f665356737b9938cca319cadd7c7eb44f0d22ffe5e997967dc7", + "specs": [ + { + "group": "Key Specs", + "label": "Wireless Technology", + "value": "Bluetooth" + }, + { + "group": "Key Specs", + "label": "Diversity", + "value": "Non-Diversity" + }, + { + "group": "Key Specs", + "label": "Max Operating Range", + "value": "164' / 50 m" + }, + { + "group": "Key Specs", + "label": "Included Transmitters", + "value": "1x Clip-On with Microphone" + }, + { + "group": "Key Specs", + "label": "Microphone Type", + "value": "1x Built-In (Clip-On Transmitter)" + }, + { + "group": "System", + "label": "Wireless Technology", + "value": "Bluetooth" + }, + { + "group": "System", + "label": "Diversity", + "value": "Non-Diversity" + }, + { + "group": "System", + "label": "RF Frequency Band", + "value": "2402 to 2480 MHz" + }, + { + "group": "System", + "label": "RF Channel Scanning", + "value": "N/A - Fixed Frequency System" + }, + { + "group": "System", + "label": "Max Operating Range", + "value": "164' / 50 m" + }, + { + "group": "System", + "label": "Max Transmitters per Band", + "value": "2" + }, + { + "group": "System", + "label": "Encryption", + "value": "No" + }, + { + "group": "System", + "label": "Built-In Recorder", + "value": "No" + }, + { + "group": "System", + "label": "Timecode Support", + "value": "No" + }, + { + "group": "System", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS" + }, + { + "group": "Transmitters", + "label": "Included Transmitters", + "value": "1x Clip-On with Microphone" + }, + { + "group": "Transmitters", + "label": "Antenna", + "value": "Internal" + }, + { + "group": "Transmitters", + "label": "Input Level", + "value": "Microphone" + }, + { + "group": "Transmitters", + "label": "Audio I/O", + "value": "No" + }, + { + "group": "Transmitters", + "label": "Bias/Plug-In & Phantom Power", + "value": "N/A - No External Mic Support" + }, + { + "group": "Transmitters", + "label": "USB I/O", + "value": "No" + }, + { + "group": "Transmitters", + "label": "Muting", + "value": "Mute Switch" + }, + { + "group": "Transmitters", + "label": "Auto-Level/Gain", + "value": "Yes" + }, + { + "group": "Transmitters", + "label": "Frequency Response", + "value": "20 Hz to 20 kHz" + }, + { + "group": "Transmitters", + "label": "Sync Method", + "value": "Bluetooth" + }, + { + "group": "Transmitters", + "label": "Display", + "value": "Single-LED Indicators Only" + }, + { + "group": "Microphones", + "label": "Microphone Type", + "value": "1x Built-In (Clip-On Transmitter)" + }, + { + "group": "Microphones", + "label": "Polar Pattern", + "value": "Omnidirectional" + }, + { + "group": "Microphones", + "label": "Frequency Response", + "value": "20 Hz to 20 kHz" + }, + { + "group": "Power", + "label": "Transmitter Battery Type", + "value": "1x Built-In Rechargeable" + }, + { + "group": "Power", + "label": "Transmitter Battery Life", + "value": "10 Hours" + }, + { + "group": "Power", + "label": "AC/DC Power Adapter", + "value": "No" + }, + { + "group": "Physical", + "label": "Environmental Resistance", + "value": "No" + }, + { + "group": "Physical", + "label": "Housing", + "value": "Plastic" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "1.1 x 0.5\" / 26.9 x 11.6 mm" + }, + { + "group": "Physical", + "label": "Weight", + "value": "0.3 oz / 7.9 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.46 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "5.4 x 4.6 x 2.3\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1903881-REG/insta360_cinsabwb_mic_air_transmitter.html", + "archive_url": "https://web.archive.org/web/20251031001632/https://www.bhphotovideo.com/c/product/1903881-REG/insta360_cinsabwb_mic_air_transmitter.html", + "archive_timestamp": "20251031001632", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "movo-photo-pm10-omnidirectional-lavalier-microphone-for-smartphones-trrs-black", + "name": "Movo Photo PM10 Omnidirectional Lavalier Microphone for Smartphones (TRRS, Black)", + "brand": "Movo Photo", + "bh_sku": "MOPM10", + "mpn": "PM10", + "department_slug": "pro-audio", + "subcategory_slug": "microphones", + "product_type": "Microphone", + "price_usd": 14.95, + "availability": "In Stock", + "condition": "New", + "description": "Getting a great sound for your vlog, YouTube channel, and social media content is much easier with the Movo Photo PM10, a lapel mic presented here in black. This lavalier mic is intended for smartphones, tablets, computers, or any other compatible device with a TRRS connection. Simply clip the mic to your person with the included clip, plug the mic into your device, and you're ready to imbue your content with high-quality audio. Since the mic will work with any app that accepts audio from your device's input jack, you can use the lapel mic in a variety of production or personal applications.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Microphone Type", + "value": "Lavalier" + }, + { + "group": "Key Specs", + "label": "Polar Pattern", + "value": "Omnidirectional" + }, + { + "group": "Key Specs", + "label": "Element Type", + "value": "Electret Condenser" + }, + { + "group": "Key Specs", + "label": "Power Sources", + "value": "Plug-In Power" + }, + { + "group": "Key Specs", + "label": "Color", + "value": "Black" + }, + { + "group": "Microphone", + "label": "Microphone Type", + "value": "Lavalier" + }, + { + "group": "Microphone", + "label": "Polar Pattern", + "value": "Omnidirectional" + }, + { + "group": "Microphone", + "label": "Element Type", + "value": "Electret Condenser" + }, + { + "group": "Microphone", + "label": "Sound Field", + "value": "Mono" + }, + { + "group": "Performance", + "label": "Frequency Response", + "value": "35 Hz to 18 kHz" + }, + { + "group": "Performance", + "label": "Sensitivity", + "value": "-30 dB (1 kHz)" + }, + { + "group": "Connectivity", + "label": "Analog Output Connector", + "value": "1x 1/8\" / 3.5 mm TRRS Male" + }, + { + "group": "Power", + "label": "Power Sources", + "value": "Plug-In Power" + }, + { + "group": "Power", + "label": "Operating Voltage", + "value": "Not Specified by Manufacturer" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black" + }, + { + "group": "Physical", + "label": "Environmental Resistance", + "value": "No" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.105 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "4.35 x 3.2 x 0.85\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1500917-REG/movo_photo_pm10_deluxe_lavalier_microphone_for.html", + "archive_url": "https://web.archive.org/web/20260221152715/https://www.bhphotovideo.com/c/product/1500917-REG/movo_photo_pm10_deluxe_lavalier_microphone_for.html", + "archive_timestamp": "20260221152715", + "fetched_at": "2026-09-12T17:27:26Z" + } + }, + { + "slug": "samson-q2u-dynamic-usb-xlr-microphone-recording-and-podcasting-kit-with-headphones-gray-mic", + "name": "Samson Q2U Dynamic USB/XLR Microphone Recording and Podcasting Kit with Headphones (Gray Mic)", + "brand": "Samson", + "bh_sku": "SAQ2UPHGK", + "mpn": null, + "department_slug": "pro-audio", + "subcategory_slug": "microphones", + "product_type": "Microphone", + "price_usd": 134.94, + "availability": "In Stock", + "condition": "New", + "description": "This Q2U Dynamic USB/XLR Microphone Recording and Podcasting Kit with Headphones from B&H combines the gray Samson Q2U USB/XLR Dynamic Microphone with a pair of closed-back studio headphones for monitoring. The kit also includes a tabletop tripod mic stand, mic clip, extension arm, foam windscreen, USB cable, and an XLR cable.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": "No", + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/saq2uphgk.jpg", + "image_sha256": "a82a7ddd1baad20c51feeaefef7227d1f1dec02e1768fa19651d7ef1ba52a609", + "specs": [ + { + "group": "Key Specs", + "label": "Microphone Type", + "value": "Handheld" + }, + { + "group": "Key Specs", + "label": "Polar Pattern", + "value": "Cardioid" + }, + { + "group": "Key Specs", + "label": "Element Type", + "value": "Dynamic" + }, + { + "group": "Key Specs", + "label": "Frequency Response", + "value": "50 Hz to 15 kHz" + }, + { + "group": "Key Specs", + "label": "Maximum SPL", + "value": "148 dB" + }, + { + "group": "Key Specs", + "label": "Analog Output", + "value": "1x XLR 3-Pin" + }, + { + "group": "Key Specs", + "label": "USB/Digital Output", + "value": "1x Mini-USB" + }, + { + "group": "Key Specs", + "label": "Power Sources", + "value": "USB Power" + }, + { + "group": "Microphone", + "label": "Microphone Type", + "value": "Handheld" + }, + { + "group": "Microphone", + "label": "Polar Pattern", + "value": "Cardioid" + }, + { + "group": "Microphone", + "label": "Element Type", + "value": "Dynamic" + }, + { + "group": "Microphone", + "label": "Sound Field", + "value": "Mono" + }, + { + "group": "Microphone", + "label": "Orientation", + "value": "End Address" + }, + { + "group": "Microphone", + "label": "Controls", + "value": "Headphone Volume, On/Off" + }, + { + "group": "Microphone", + "label": "Pad", + "value": "No" + }, + { + "group": "Performance", + "label": "Frequency Response", + "value": "50 Hz to 15 kHz" + }, + { + "group": "Performance", + "label": "Maximum SPL", + "value": "148 dB" + }, + { + "group": "Performance", + "label": "Sensitivity", + "value": "-54 dB" + }, + { + "group": "Connectivity", + "label": "Analog Output Connector", + "value": "1x XLR 3-Pin" + }, + { + "group": "Connectivity", + "label": "USB/Digital Output", + "value": "1x Mini-USB |" + }, + { + "group": "Connectivity", + "label": "Wireless", + "value": "No" + }, + { + "group": "Digital Audio", + "label": "A/D Conversion", + "value": "16-Bit" + }, + { + "group": "Digital Audio", + "label": "Sample Rate", + "value": "48 kHz" + }, + { + "group": "Digital Audio", + "label": "Digital Signal Processing & FX", + "value": "No" + }, + { + "group": "Digital Audio", + "label": "OS Compatibility", + "value": "Windows | macOS" + }, + { + "group": "Power", + "label": "Power Sources", + "value": "USB Power" + }, + { + "group": "Power", + "label": "Operating Voltage", + "value": "5 V" + }, + { + "group": "Physical", + "label": "Mounting Thread Size", + "value": "5/8\"-27 Female" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "ø: 2.2 x L: 7.5\" / ø: 55.88 x L: 190.5 mm" + }, + { + "group": "Physical", + "label": "Weight", + "value": "11.2 oz / 0.32 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.93 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "10.05 x 7.5 x 2.55\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1701649-REG/samson_q2u_dynamic_usb_xlr_microphone.html", + "archive_url": "https://web.archive.org/web/20260507092344/https://www.bhphotovideo.com/c/product/1701649-REG/samson_q2u_dynamic_usb_xlr_microphone.html", + "archive_timestamp": "20260507092344", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "televic-mike-plm401f-16-single-flex-gooseneck-microphone", + "name": "TELEVIC Mike PLM401F 16\" Single Flex Gooseneck Microphone", + "brand": "TELEVIC", + "bh_sku": "TEMPLM401F40", + "mpn": "71.98.0094", + "department_slug": "pro-audio", + "subcategory_slug": "microphones", + "product_type": "Microphone", + "price_usd": 265.0, + "availability": "In Stock", + "condition": "New", + "description": "The Mike PLM401F 16\" Single Flex Gooseneck Microphone from Televic is a removable gooseneck microphone that aims to provide exceptional sound quality and a wide range of movement. Made for deployment in Televic's Plixus habitats, Mike is easy to mount with a simple push lock, and is designed for maximum resistance to RF interference.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/templm401f40.jpg", + "image_sha256": "e417a7bb01c47c2df8e63932cdfe5af02c594ec454eaa37a4d4f97d51de443f0", + "specs": [ + { + "group": "Key Specs", + "label": "Microphone Type", + "value": "Gooseneck (Speech/Non-Instrument)" + }, + { + "group": "Key Specs", + "label": "Polar Pattern", + "value": "Cardioid" + }, + { + "group": "Key Specs", + "label": "Element Type", + "value": "Electret Condenser" + }, + { + "group": "Key Specs", + "label": "Controls", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Frequency Response", + "value": "125 Hz to 15 kHz" + }, + { + "group": "Key Specs", + "label": "Maximum SPL", + "value": "110 dB (at 1 kHz)" + }, + { + "group": "Key Specs", + "label": "Analog Output", + "value": "1x Proprietary Locking" + }, + { + "group": "Key Specs", + "label": "Power Sources", + "value": "Plug-In Power" + }, + { + "group": "Microphone", + "label": "Microphone Type", + "value": "Gooseneck (Speech/Non-Instrument)" + }, + { + "group": "Microphone", + "label": "Polar Pattern", + "value": "Cardioid" + }, + { + "group": "Microphone", + "label": "Element Type", + "value": "Electret Condenser" + }, + { + "group": "Microphone", + "label": "Sound Field", + "value": "Mono" + }, + { + "group": "Microphone", + "label": "Orientation", + "value": "End Address" + }, + { + "group": "Microphone", + "label": "Controls", + "value": "No" + }, + { + "group": "Microphone", + "label": "Filter & EQ", + "value": "No" + }, + { + "group": "Microphone", + "label": "Circuitry", + "value": "Solid-State" + }, + { + "group": "Performance", + "label": "Frequency Response", + "value": "125 Hz to 15 kHz" + }, + { + "group": "Performance", + "label": "Maximum SPL", + "value": "110 dB (at 1 kHz)" + }, + { + "group": "Performance", + "label": "Sensitivity", + "value": "-40 dBV/Pa" + }, + { + "group": "Performance", + "label": "Dynamic Range", + "value": "90 dB (greater than)" + }, + { + "group": "Performance", + "label": "Equivalent Noise Level", + "value": "20 dB SPL (A)" + }, + { + "group": "Connectivity", + "label": "Analog Output Connector", + "value": "1x Proprietary Locking" + }, + { + "group": "Power", + "label": "Power Sources", + "value": "Plug-In Power" + }, + { + "group": "Power", + "label": "Operating Voltage", + "value": "Not Specified by Manufacturer" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "H: 16.6 x W: 1 x L: 1\" / H: 422 x W: 25 x L: 25 mm" + }, + { + "group": "Physical", + "label": "Weight", + "value": "3.7 oz / 105 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.495 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "19.4 x 2.8 x 1.5\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1925084-REG/televic_71_98_0094_mike_gooseneck_mic_plm401f.html", + "archive_url": "https://web.archive.org/web/20260603124207/https://www.bhphotovideo.com/c/product/1925084-REG/televic_71_98_0094_mike_gooseneck_mic_plm401f.html", + "archive_timestamp": "20260603124207", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "se-electronics-v7-mc2-supercardioid-dynamic-microphone-capsule-for-sennheiser-wireless-handheld-transmitters-24-carat-gold-plated", + "name": "sE Electronics V7 MC2 Supercardioid Dynamic Microphone Capsule for Sennheiser Wireless Handheld Transmitters (24-Carat Gold Plated)", + "brand": "sE Electronics", + "bh_sku": "SEV7MC2GOMP3", + "mpn": "V7MC2GOMP3", + "department_slug": "pro-audio", + "subcategory_slug": "microphones", + "product_type": "Microphone", + "price_usd": 199.0, + "availability": "In Stock", + "condition": "New", + "description": "Bring the powerful sound and performance of the sE Electronics' V7 series to Sennheiser wireless transmitters with the V7 MC2 Microphone Capsule. This supercardioid dynamic capsule comes straight from the V7 mic and offers the same feedback rejection, natural vocal response, and rumble-free internal shockmount as the original.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Frequency Response", + "value": "40 Hz to 19 kHz" + }, + { + "group": "Performance", + "label": "Frequency Response", + "value": "40 Hz to 19 kHz" + }, + { + "group": "Performance", + "label": "Sensitivity", + "value": "2 mV/Pa / -54 dBV" + }, + { + "group": "Physical", + "label": "Color", + "value": "Gold" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "0.59 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "6.6 x 3.5 x 3.1\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1928621-REG/se_electronics_v7mc2gomp3_v7_mic_capsule_supercardioid.html", + "archive_url": "https://web.archive.org/web/20260629192732/https://www.bhphotovideo.com/c/product/1928621-REG/se_electronics_v7mc2gomp3_v7_mic_capsule_supercardioid.html", + "archive_timestamp": "20260629192732", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "canon-eos-c80-cinema-camera-kit-with-24-50mm-f-1-4-l-vcm-lenses-canon-rf", + "name": "Canon EOS C80 Cinema Camera Kit with 24 & 50mm f/1.4 L VCM Lenses (Canon RF)", + "brand": "Canon", + "bh_sku": "CAEC802450K", + "mpn": null, + "department_slug": "pro-video", + "subcategory_slug": "cinema-cameras", + "product_type": "Cinema Camera", + "price_usd": 8547.0, + "availability": "In Stock", + "condition": "New", + "description": "Ideal for solo operators, the lightweight Canon EOS C80 Cinema Camera Kit with 24 & 50mm from B&H provides quick full-frame capture at almost any light level. This kit comprises a C80 6K digital cine camera with 12G-SDI/HDMI output and 24 and 50mm f/1.4 L VCM prime lenses featuring fast autofocus.", + "mount_type": "Canon RF", + "sensor_size": "Full-Frame", + "focal_length": null, + "connectivity": "Wi-Fi 5 (802.11ac)", + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/caec802450k.jpg", + "image_sha256": "1dc311aaedf234cfff143643d29292ef6dc9096230eb63ce9bde5a5e812058f9", + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Canon RF" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Effective Sensor Resolution", + "value": "19.05 Megapixel (6008 x 3170)" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Digital" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 102,400" + }, + { + "group": "Key Specs", + "label": "Max Recording Modes", + "value": "Cinema RAW Light 12-Bit | Up to 6K at 24.00/25/29.97/23.98 fps | XF-AVC S Intra 4:2:2 8/10-Bit | Up to DCI 4K at 50/120/59.94 fps | | | XF-AVC S Long GOP 4:2:0 8-Bit | Up to DCI 4K at 50/120/59.94 fps | | | XF-HEVC S Long GOP 4:2:2 10-Bit | Up to DCI 4K at 50/120/59.94 fps | | | XF-HEVC S Long GOP 4:2:0 10-Bit | Up to DCI 4K at 50/120/59.94 fps | | | XF-HEVC S Intra 4:2:0 8-Bit | Up to DCI 2K at 24.00/25/29.97/50/59.94/23.98 fps | | XF-HEVC S Long GOP 4:2:0 10-Bit | Up to DCI 2K at 24.00/25/29.97/50/59.94/60.00/23.98 fps | XF-HEVC S Long GOP 4:2:0 8-Bit | 720p at 24.00/25/50/59.94/23.98 fps" + }, + { + "group": "Key Specs", + "label": "Max Video Output", + "value": "via SDI/BNC / USB / HDMI | DCI 4K" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Slot 1: SD/SDHC/SDXC | Slot 2: SD/SDHC/SDXC" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x BNC (12G-SDI) Output | 1x HDMI Output" + }, + { + "group": "Key Specs", + "label": "Mobile App Compatible", + "value": "Yes: iOS Only | Functionality: View Live Feed, Remote Control, Adjust Settings" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "Canon BP-AN Series" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Canon RF" + }, + { + "group": "Imaging", + "label": "Lens Communication", + "value": "Yes: Cooke /i" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "Full-Frame BSI Stacked CMOS" + }, + { + "group": "Imaging", + "label": "Effective Sensor Resolution", + "value": "Effective: 19.05 Megapixel (6008 x 3170) | Actual: 26.67 Megapixel (6202 x 4300)" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Digital, 5-Axis" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "Mechanical Filter Wheel with 6-Stop (1/64), 2-Stop (1/4), 4-Stop (1/16), 8-Stop (1/256), 10-Stop (1/1024) ND Filters" + }, + { + "group": "Imaging", + "label": "Internal Filter Holder", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "1 to 1/2000 Second" + }, + { + "group": "Exposure Control", + "label": "Shutter Angle", + "value": "11.25 to 360°" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 102,400" + }, + { + "group": "Exposure Control", + "label": "Advertised Dynamic Range", + "value": "16 Stops" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Range: 2000 to 15,000K | Presets: Set B, Tungsten, Set A, Daylight, AWB" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Continuous-Servo AF, One-Shot AF, Manual Focus, Focus Lock AF Area Mode" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "Cinema RAW Light 12-Bit | 6000 x 3164 at 24.00/25/29.97/23.98 fps (553 to 639 Mb/s) | 4368 x 2304 at 23.98/50/24.00/25/29.97/59.94 fps (293 to 678 Mb/s) | XF-AVC S Intra 4:2:2 8/10-Bit | 4096 x 2160 at 50/120/59.94 fps (150 to 600 Mb/s) | 3840 x 2160 at 23.98/120/50/24.00/25/29.97/59.94 fps (150 to 500 Mb/s) | 2048 x 1080 at 23.98/120/180/50/24.00/25/29.97/59.94 fps (35 to 300 Mb/s) | 1920 x 1080 at 23.98/120/180/50/24.00/25/29.97/59.94 fps (35 to 300 Mb/s) | XF-AVC S Long GOP 4:2:0 8-Bit | 4096 x 2160 at 50/120/59.94 fps (150 Mb/s) | 3840 x 2160 at 23.98/120/24.00/25/29.97 fps (100 Mb/s) | 2048 x 1080 at 23.98/180/50/24.00/25/29.97/59.94 fps (35 Mb/s) | 1920 x 1080 at 23.98/180/50/24.00/25/29.97/59.94 fps (35 Mb/s) | XF-HEVC S Long GOP 4:2:2 10-Bit | 4096 x 2160 at 50/120/59.94 fps (225 Mb/s) | 3840 x 2160 at 23.98/120/24.00/25/29.97 fps (135 Mb/s) | 2048 x 1080 at 23.98/180/50/24.00/25/29.97/59.94/30.00 fps (50 Mb/s) | 1920 x 1080 at 23.98/180/50/24.00/25/29.97/59.94/30.00 fps (50 Mb/s) | XF-HEVC S Long GOP 4:2:0 10-Bit | 4096 x 2160 at 50/120/59.94 fps (150 Mb/s) | 3840 x 2160 at 23.98/120/24.00/25/29.97 fps (100 Mb/s) | 2048 x 1080 at 23.98/180/50/24.00/25/29.97/59.94 fps (35 Mb/s) | 1920 x 1080 at 23.98/180/24.00/25/29.97/59.94 fps (35 Mb/s) | XF-HEVC S Intra 4:2:0 8-Bit | 2048 x 1080 at 24.00/25/29.97/50/59.94/23.98 fps (9 to 16 Mb/s) | 1920 x 1080 at 23.98/50/24.00/25/29.97/59.94/60.00 fps (9 to 16 Mb/s) | 1280 x 720 at 23.98/50/24.00/25/29.97/59.94 fps (6 Mb/s) | *Sensor Crops During Recording | XF-HEVC S Long GOP 4:2:0 10-Bit | 2048 x 1080 at 24.00/25/29.97/50/59.94/60.00/23.98 fps (9 to 16 Mb/s) | 1920 x 1080 at 23.98/50/24.00/25/29.97/59.94 fps (9 to 16 Mb/s) | XF-HEVC S Long GOP 4:2:0 8-Bit | 1280 x 720 at 24.00/25/50/59.94/23.98 fps6 Mb/s)" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "via SDI/BNC / USB / HDMI | 4096 x 2160" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Yes" + }, + { + "group": "Video Capture", + "label": "Gamma Curve", + "value": "Canon Log 2, Canon Log 3, Rec2020, HDR-HLG, Rec709" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "Cinema RAW Light: 4-Channel, 24-Bit at 48 kHz via LPCM Audio | XF-AVC: 4-Channel, 24-Bit at 48 kHz via LPCM Audio | XF-AVC S, XF-HEVC S: 4-Channel, 24-Bit at 48 kHz via LPCM Audio | XF-AVC S, XF-HEVC S: 2-Channel, 16-Bit at 48 kHz via AAC Audio" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "H.264, RTSP, UDP, RTP, SRT, MPEG2 | 1920 x 1080 at 50p, 59.94p, 59.94i, 50i (4.0 to 9.0 Mb/s)" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Slot 1: SD/SDHC/SDXC | Slot 2: SD/SDHC/SDXC" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x BNC (12G-SDI) Output | 1x HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "2x Mini XLR Input | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input on Camera Body | 1x 1/8\" / 3.5 mm TRS Stereo Headphone Output" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x Barrel (23.7 to 25VDC) Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x RJ45 (XC) Control | 1x USB-C Monitor | 1x BNC (Timecode) (Shared with Video Output) | 1x 2.5 mm Sub-Mini (LANC) Control" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "Wi-Fi 5 (802.11ac)" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: iOS Only | App Name: Remote Camera Control App | Functionality: View Live Feed, Remote Control, Adjust Settings" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "No" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Primary Monitor: Included External 3.5\" Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "Primary Monitor: 1280 x 720" + }, + { + "group": "Power", + "label": "Battery", + "value": "Canon BP-AN Series" + }, + { + "group": "Power", + "label": "Power Consumption", + "value": "≤19.6 W" + }, + { + "group": "Environmental", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C up to 85% Humidity" + }, + { + "group": "Environmental", + "label": "Storage Conditions", + "value": "23 to 113°F / -5 to 45°C up to 60% Humidity" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Intelligent Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 3/8\"-16 Female | 2x 1/4\"-20 Female" + }, + { + "group": "General", + "label": "Netflix Approved", + "value": "Yes" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "6.3 x 5.4 x 4.6\" / 160 x 138 x 116 mm | 10.9 x 6.8 x 6.3\" / 276 x 173 x 160 mm (With Included Battery, Handle, Mic Holder)" + }, + { + "group": "General", + "label": "Weight", + "value": "2.87 lb / 1.30 kg (Body Only) | 3.406 lb / 1.545 kg (With Handle, Battery)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "6.385 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "11 x 8.9 x 7.4\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1915619-REG/canon_eos_c80_cinema_camera.html", + "archive_url": "https://web.archive.org/web/20260223050102/https://www.bhphotovideo.com/c/product/1915619-REG/canon_eos_c80_cinema_camera.html", + "archive_timestamp": "20260223050102", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "canon-eos-c80-cinema-camera-kit-with-24-70-24-and-50mm-lenses-canon-rf", + "name": "Canon EOS C80 Cinema Camera Kit with 24-70, 24, and 50mm Lenses (Canon RF)", + "brand": "Canon", + "bh_sku": "CAEC802470K1", + "mpn": null, + "department_slug": "pro-video", + "subcategory_slug": "cinema-cameras", + "product_type": "Cinema Camera", + "price_usd": 11346.0, + "availability": "In Stock", + "condition": "New", + "description": "Ideal for solo operators, the lightweight Canon EOS C80 Cinema Camera Kit with 24-70, 24, and 50mm Lenses from B&H provides quick full-frame capture at almost any light level. This kit comprises a C80 6K digital cine camera with 12G-SDI/HDMI output, 24-70mm f/2.8 L IS USM zoom, and 24 and 50mm f/1.4 L VCM prime lenses featuring fast autofocus.", + "mount_type": "Canon RF", + "sensor_size": "Full-Frame", + "focal_length": null, + "connectivity": "Wi-Fi 5 (802.11ac)", + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Canon RF" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Effective Sensor Resolution", + "value": "19.05 Megapixel (6008 x 3170)" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Digital" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 102,400" + }, + { + "group": "Key Specs", + "label": "Internal Recording", + "value": "Cinema RAW Light 12-Bit | Up to 6K at 24.00/25/29.97/23.98 fps | XF-AVC S Intra 4:2:2 8/10-Bit | Up to DCI 4K at 50/120/59.94 fps | | | XF-AVC S Long GOP 4:2:0 8-Bit | Up to DCI 4K at 50/120/59.94 fps | | | XF-HEVC S Long GOP 4:2:2 10-Bit | Up to DCI 4K at 50/120/59.94 fps | | | XF-HEVC S Long GOP 4:2:0 10-Bit | Up to DCI 4K at 50/120/59.94 fps | | | XF-HEVC S Intra 4:2:0 8-Bit | Up to DCI 2K at 24.00/25/29.97/50/59.94/23.98 fps | | XF-HEVC S Long GOP 4:2:0 10-Bit | Up to DCI 2K at 24.00/25/29.97/50/59.94/60.00/23.98 fps | XF-HEVC S Long GOP 4:2:0 8-Bit | 720p at 24.00/25/50/59.94/23.98 fps" + }, + { + "group": "Key Specs", + "label": "Video Output", + "value": "SDI/BNC / USB / HDMI | DCI 4K" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Slot 1: SD/SDHC/SDXC | Slot 2: SD/SDHC/SDXC" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x BNC (12G-SDI) Output | 1x HDMI Output" + }, + { + "group": "Key Specs", + "label": "Mobile App Compatible", + "value": "Yes: iOS Only | Functionality: View Live Feed, Remote Control, Adjust Settings" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "Canon BP-AN Series" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Canon RF" + }, + { + "group": "Imaging", + "label": "Lens Communication", + "value": "Yes: Cooke /i" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "Full-Frame BSI Stacked CMOS" + }, + { + "group": "Imaging", + "label": "Effective Sensor Resolution", + "value": "Effective: 19.05 Megapixel (6008 x 3170) | Actual: 26.67 Megapixel (6202 x 4300)" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Digital, 5-Axis" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "Mechanical Filter Wheel with 6-Stop (1/64), 2-Stop (1/4), 4-Stop (1/16), 8-Stop (1/256), 10-Stop (1/1024) ND Filters" + }, + { + "group": "Imaging", + "label": "Internal Filter Holder", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "1/2000 to 1 Second" + }, + { + "group": "Exposure Control", + "label": "Shutter Angle", + "value": "11.25 to 360°" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Native: 100 to 102,400" + }, + { + "group": "Exposure Control", + "label": "Advertised Dynamic Range", + "value": "16 Stops" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Range: 2000 to 15,000K | Presets: Set B, Tungsten, Set A, Daylight, AWB" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Continuous-Servo AF, One-Shot AF, Manual Focus, Focus Lock AF Area Mode" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "Cinema RAW Light 12-Bit | 6000 x 3164 at 24.00/25/29.97/23.98 fps (553 to 639 Mb/s) | 4368 x 2304 at 23.98/50/24.00/25/29.97/59.94 fps (293 to 678 Mb/s) | XF-AVC S Intra 4:2:2 8/10-Bit | 4096 x 2160 at 50/120/59.94 fps (150 to 600 Mb/s) | 3840 x 2160 at 23.98/120/50/24.00/25/29.97/59.94 fps (150 to 500 Mb/s) | 2048 x 1080 at 23.98/120/180/50/24.00/25/29.97/59.94 fps (35 to 300 Mb/s) | 1920 x 1080 at 23.98/120/180/50/24.00/25/29.97/59.94 fps (35 to 300 Mb/s) | XF-AVC S Long GOP 4:2:0 8-Bit | 4096 x 2160 at 50/120/59.94 fps (150 Mb/s) | 3840 x 2160 at 23.98/120/24.00/25/29.97 fps (100 Mb/s) | 2048 x 1080 at 23.98/180/50/24.00/25/29.97/59.94 fps (35 Mb/s) | 1920 x 1080 at 23.98/180/50/24.00/25/29.97/59.94 fps (35 Mb/s) | XF-HEVC S Long GOP 4:2:2 10-Bit | 4096 x 2160 at 50/120/59.94 fps (225 Mb/s) | 3840 x 2160 at 23.98/120/24.00/25/29.97 fps (135 Mb/s) | 2048 x 1080 at 23.98/180/50/24.00/25/29.97/59.94/30.00 fps (50 Mb/s) | 1920 x 1080 at 23.98/180/50/24.00/25/29.97/59.94/30.00 fps (50 Mb/s) | XF-HEVC S Long GOP 4:2:0 10-Bit | 4096 x 2160 at 50/120/59.94 fps (150 Mb/s) | 3840 x 2160 at 23.98/120/24.00/25/29.97 fps (100 Mb/s) | 2048 x 1080 at 23.98/180/50/24.00/25/29.97/59.94 fps (35 Mb/s) | 1920 x 1080 at 23.98/180/24.00/25/29.97/59.94 fps (35 Mb/s) | XF-HEVC S Intra 4:2:0 8-Bit | 2048 x 1080 at 24.00/25/29.97/50/59.94/23.98 fps (9 to 16 Mb/s) | 1920 x 1080 at 23.98/50/24.00/25/29.97/59.94/60.00 fps (9 to 16 Mb/s) | 1280 x 720 at 23.98/50/24.00/25/29.97/59.94 fps (6 Mb/s) | *Sensor Crops During Recording | XF-HEVC S Long GOP 4:2:0 10-Bit | 2048 x 1080 at 24.00/25/29.97/50/59.94/60.00/23.98 fps (9 to 16 Mb/s) | 1920 x 1080 at 23.98/50/24.00/25/29.97/59.94 fps (9 to 16 Mb/s) | XF-HEVC S Long GOP 4:2:0 8-Bit | 1280 x 720 at 24.00/25/50/59.94/23.98 fps6 Mb/s)" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "SDI/BNC / USB / HDMI | 4096 x 2160" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Yes" + }, + { + "group": "Video Capture", + "label": "Gamma Curve", + "value": "Canon Log 2, Canon Log 3, Rec2020, HDR-HLG, Rec709" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "Cinema RAW Light: 4-Channel, 24-Bit at 48 kHz via LPCM Audio | XF-AVC: 4-Channel, 24-Bit at 48 kHz via LPCM Audio | XF-AVC S, XF-HEVC S: 4-Channel, 24-Bit at 48 kHz via LPCM Audio | XF-AVC S, XF-HEVC S: 2-Channel, 16-Bit at 48 kHz via AAC Audio" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "H.264, RTSP, UDP, RTP, SRT, MPEG2 | 1920 x 1080 at 50p, 59.94p, 59.94i, 50i (4.0 to 9.0 Mb/s)" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Slot 1: SD/SDHC/SDXC | Slot 2: SD/SDHC/SDXC" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x BNC (12G-SDI) Output | 1x HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "2x Mini XLR Input | 1x 1/8\" / 3.5 mm TRS Stereo Microphone Input on Camera Body | 1x 1/8\" / 3.5 mm TRS Stereo Headphone Output" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x Barrel (23.7 to 25VDC) Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x RJ45 (XC) Control | 1x USB-C Monitor | 1x BNC (Timecode) (Shared with Video Output) | 1x 2.5 mm Sub-Mini (LANC) Control" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "Wi-Fi 5 (802.11ac)" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: iOS Only | App Name: Remote Camera Control App | Functionality: View Live Feed, Remote Control, Adjust Settings" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "No" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Primary Monitor: Included External 3.5\" Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "Primary Monitor: 1280 x 720" + }, + { + "group": "Power", + "label": "Battery", + "value": "Canon BP-AN Series" + }, + { + "group": "Power", + "label": "Power Consumption", + "value": "≤19.6 W" + }, + { + "group": "Environmental", + "label": "Operating Conditions", + "value": "32 to 104°F / 0 to 40°C up to 85% Humidity" + }, + { + "group": "Environmental", + "label": "Storage Conditions", + "value": "23 to 113°F / -5 to 45°C up to 60% Humidity" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Intelligent Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 3/8\"-16 Female | 2x 1/4\"-20 Female" + }, + { + "group": "General", + "label": "Netflix Approved", + "value": "Yes" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "6.3 x 5.4 x 4.6\" / 160 x 138 x 116 mm | 10.9 x 6.8 x 6.3\" / 276 x 173 x 160 mm (With Included Battery, Handle, Mic Holder)" + }, + { + "group": "General", + "label": "Weight", + "value": "2.87 lb / 1.30 kg (Body Only) | 3.406 lb / 1.545 kg (With Handle, Battery)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "6.385 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "11 x 8.9 x 7.4\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1915623-REG/canon_eos_c80_cinema_camera.html", + "archive_url": "https://web.archive.org/web/20260131083358/https://www.bhphotovideo.com/c/product/1915623-REG/canon_eos_c80_cinema_camera.html", + "archive_timestamp": "20260131083358", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "nikon-zr-cinema-camera-with-35mm-f-1-4-lens-kit", + "name": "Nikon ZR Cinema Camera with 35mm f/1.4 Lens Kit", + "brand": "Nikon", + "bh_sku": "NIZR35", + "mpn": "2042", + "department_slug": "pro-video", + "subcategory_slug": "cinema-cameras", + "product_type": "Cinema Camera", + "price_usd": 2846.95, + "availability": "In Stock", + "condition": "New", + "description": "Add the portable, all-in-one Nikon ZR Cinema Camera with 35mm f/1.4 Lens Kit to your next production. This kit combines the full-frame mirrorless ZR 6K cinema camera with the NIKKOR Z 35mm f/1.4 lens.", + "mount_type": "Nikon Z", + "sensor_size": "Full-Frame", + "focal_length": null, + "connectivity": "Wi-Fi / Bluetooth", + "megapixels": null, + "capacity_gb": null, + "image_path": "images/products/nizr35.jpg", + "image_sha256": "74931d8978117df01a8def2576615bef37ed6874c2ba393ef55508001c7f8ceb", + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Nikon Z" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "Full-Frame" + }, + { + "group": "Key Specs", + "label": "Effective Sensor Resolution", + "value": "24.5 Megapixel" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "Sensor-Shift" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Dual Base: 800 / 6400 | Native: 100 to 64,000" + }, + { + "group": "Key Specs", + "label": "Internal Recording", + "value": "ProRes RAW 12-Bit | Up to 6K at 25/29.97/23.98 fps | REDCODE RAW 12-Bit | Up to 6K at 25/29.97/50/59.94/23.98 fps | | H.265 4:2:0 8/10-Bit | Up to 5.3K at 25/29.97/50/59.94/23.98 fps | | ProRes 422 HQ 4:2:2 10-Bit | Up to 5.3K at 25/29.97/23.98 fps | | H.264 4:2:0 8-Bit | 1080p at 25/29.97/50/59.94/23.98 fps" + }, + { + "group": "Key Specs", + "label": "Video Output", + "value": "HDMI | UHD 4K" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Slot 1: CFexpress Type B | Slot 2: microSD/microSDHC/microSDXC (UHS-I)" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Key Specs", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "Nikon EN-EL15c" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Nikon Z" + }, + { + "group": "Imaging", + "label": "Lens Communication", + "value": "Yes: with Autofocus Support" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "35.9 x 23.9 mm (Full-Frame) CMOS" + }, + { + "group": "Imaging", + "label": "Effective Sensor Resolution", + "value": "24.5 Megapixel" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "Sensor-Shift, 5-Axis" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "No" + }, + { + "group": "Imaging", + "label": "Built-In CC Filter", + "value": "No" + }, + { + "group": "Imaging", + "label": "Internal Filter Holder", + "value": "No" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "Electronic Shutter | 1/16000 to 900 Seconds" + }, + { + "group": "Exposure Control", + "label": "Shutter Angle", + "value": "5.6 to 360°" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Dual Base: 800 / 6400 | Native: 100 to 64,000" + }, + { + "group": "Exposure Control", + "label": "Signal-to-Noise Ratio", + "value": "Not Specified by Manufacturer" + }, + { + "group": "Exposure Control", + "label": "Advertised Dynamic Range", + "value": "15 Stops" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Range: 2500 to 10,000K | Presets: Auto, Cloudy, Color Temperature, Direct Sunlight, Flash, Fluorescent, Incandescent, Preset Manual, Shade" + }, + { + "group": "Exposure Control", + "label": "Exposure Modes", + "value": "Auto, Manual" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Automatic, Continuous-Servo AF, Full-Time Servo, Manual Focus" + }, + { + "group": "Video Capture", + "label": "Internal Recording", + "value": "ProRes RAW 12-Bit | 6048 x 3402 at 25/29.97/23.98 fps | 4030 x 2268 at 23.98/50/25/29.97/59.94 fps | REDCODE RAW 12-Bit | 6048 x 3402 at 25/29.97/50/59.94/23.98 fps (780 to 3780 Mb/s) | 4030 x 2268 at 23.98/50/25/29.97/59.94 fps (700 to 1710 Mb/s) | 3984 x 2240 at 100/23.98/120/50/25/29.97/59.94 fps | H.265 4:2:0 8/10-Bit | 5376 x 3024 at 25/29.97/50/59.94/23.98 fps | 3840 x 2160 at 100/23.98/120/50/25/29.97/59.94 fps | 1920 x 1080 at 200/100/23.98/240/120/50/25/29.97/59.94 fps | ProRes 422 HQ 4:2:2 10-Bit | 5376 x 3024 at 25/29.97/23.98 fps | 3840 x 2160 at 23.98/50/25/29.97/59.94 fps | 1920 x 1080 at 100/120/50/59.94 fps | H.264 4:2:0 8-Bit | 1920 x 1080 at 25/29.97/50/59.94/23.98 fps" + }, + { + "group": "Video Capture", + "label": "Video Output", + "value": "HDMI | 3840 x 2160" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Yes" + }, + { + "group": "Video Capture", + "label": "Gamma Curve", + "value": "Nikon N-Log, REDWideGamutRGB" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "ProRes, Raw: 2-Channel, 32-Bit | ProRes, Raw: 2-Channel, 24-Bit" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Slot 1: CFexpress Type B | Slot 2: microSD/microSDHC/microSDXC (UHS-I)" + }, + { + "group": "Interface", + "label": "Internal Storage", + "value": "No" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x Micro-HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "1x 1/8\" / 3.5 mm TRS Stereo Mic/Line Input | 1x 1/8\" / 3.5 mm TRS Stereo Headphone Output" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x USB-C Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x USB-C (USB 3.2 / 3.1 Gen 2) Data Output (Shared with Power Input)" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "Wi-Fi / Bluetooth" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "Yes: Android & iOS | App Name: SnapBridge" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "No" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Primary Monitor: Articulating 4\" Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "Primary Monitor: 3,070,000 Dot" + }, + { + "group": "Power", + "label": "Battery", + "value": "Nikon EN-EL15c" + }, + { + "group": "General", + "label": "Shoe Mount", + "value": "1x Intelligent Hot Shoe" + }, + { + "group": "General", + "label": "Tripod Mount", + "value": "1x 1/4\"-20 Female (Bottom)" + }, + { + "group": "General", + "label": "Accessory Mounting Thread", + "value": "No" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "5.2 x 3.2 x 1.9\" / 133 x 80.5 x 48.7 mm" + }, + { + "group": "General", + "label": "Weight", + "value": "1.19 lb / 540 g (Body Only)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "2.27 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "8 x 7 x 5.3\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1920128-REG/nikon_2042_zr_cinema_camera_with.html", + "archive_url": "https://web.archive.org/web/20260107215728/https://www.bhphotovideo.com/c/product/1920128-REG/nikon_2042_zr_cinema_camera_with.html", + "archive_timestamp": "20260107215728", + "fetched_at": "2026-09-12T17:27:29Z" + } + }, + { + "slug": "red-digital-cinema-red-evf-mount", + "name": "RED DIGITAL CINEMA RED EVF Mount", + "brand": "RED DIGITAL CINEMA", + "bh_sku": "RE7900753", + "mpn": "790-0753", + "department_slug": "pro-video", + "subcategory_slug": "cinema-cameras", + "product_type": "Cinema Camera", + "price_usd": 1250.0, + "availability": "In Stock", + "condition": "New", + "description": "Attach your RED Compact EVF or DSMC2 RED EVF to your compatible camera system using this RED DIGITAL CINEMA RED EVF Mount. The mount is a 15mm rod-based solution with a multi-axis telescoping design for easy positioning. A screw-on EVF clamp and thumbscrews make for a quick setup and integration of the separately available EVF Extension Arm. Laser-etched distance and angle markers ensure precise and intuitive adjustment.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "General", + "label": "Compatibility", + "value": "RED DIGITAL CINEMA RED Compact EVF / DSCM2 RED EVF / DSMC2 Camera Systems / DSMC3 Camera Systems / RED EVF Extension Arm" + }, + { + "group": "Physical", + "label": "Mounting", + "value": "2x 15mm Rod | 1x Attachment Wheel | 1x Screw-On EVF Clamp" + }, + { + "group": "Physical", + "label": "Color", + "value": "Black" + }, + { + "group": "Physical", + "label": "Material of Construction", + "value": "Aluminum" + }, + { + "group": "Physical", + "label": "Environmental Resistance", + "value": "No" + }, + { + "group": "Physical", + "label": "Dimensions", + "value": "5.3 x 2.6 x 2.5\" / 134.9 x 67.3 x 62.5 mm" + }, + { + "group": "Physical", + "label": "Weight", + "value": "13.8 oz / 390.1 g" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "1.57 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "12.5 x 9.8 x 3.6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1807143-REG/red_digital_cinema_790_0753_red_evf_mount.html", + "archive_url": "https://web.archive.org/web/20251016001726/https://www.bhphotovideo.com/c/product/1807143-REG/red_digital_cinema_790_0753_red_evf_mount.html", + "archive_timestamp": "20251016001726", + "fetched_at": "2026-09-12T17:27:28Z" + } + }, + { + "slug": "sony-fx6-digital-cinema-camera-kit-with-24-105mm-lens", + "name": "Sony FX6 Digital Cinema Camera Kit with 24-105mm Lens", + "brand": "Sony", + "bh_sku": "SOFX6K", + "mpn": "ILME-FX6VK", + "department_slug": "pro-video", + "subcategory_slug": "cinema-cameras", + "product_type": "Cinema Camera", + "price_usd": 7198.0, + "availability": "In Stock", + "condition": "New", + "description": "Developed to offer versatile, cine-style imaging in a truly compact form, the FX6 Full-Frame Camera Kit from Sony pairs the FX6 camera with the 24-105mm f/4 G OSS E-mount zoom lens. With the ability to capture up to 15+ stops of dynamic range, Sony's S-Cinetone gamma for filmlike skin tones, and up to 10-bit, 4:2:2 XAVC-I recording, the FX6 is poised to both supplement your FX9 or VENICE capture and to nimbly take on documentary, gimbal, and drone shoots on its own. The FX6 camera combines a 4K full-frame Exmor R sensor with a BIONX XR engine for extremely sensitive capture in a range of settings using a base ISO of 800 as well as an ISO 12800 high-sensitivity mode for nuanced low-light scenes.", + "mount_type": "Sony E", + "sensor_size": "Full-Frame CMOS", + "focal_length": null, + "connectivity": "2.4 / 5 GHz Wi-Fi 5 (802.11ac)", + "megapixels": 10.2, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Lens Mount", + "value": "Sony E" + }, + { + "group": "Key Specs", + "label": "Sensor Resolution", + "value": "Actual: 12.9 Megapixel | Effective: 10.2 Megapixel (1420 x 802)" + }, + { + "group": "Key Specs", + "label": "Image Sensor", + "value": "Full-Frame CMOS" + }, + { + "group": "Key Specs", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Key Specs", + "label": "ISO/Gain Sensitivity", + "value": "Native: 800 to 12,800 (320 to 409,600 Extended) | Gain: -3 to 18 dB dB" + }, + { + "group": "Key Specs", + "label": "Internal Recording Modes", + "value": "XAVC-I 4:2:2 10-Bit | 4096 x 2160 from 1 to 59.94 fps [240 to 600 Mb/s] | 3840 x 2160 from 1 to 59.94/100 fps [240 to 600 Mb/s] | 1920 x 1080p from 1 to 59.94/100/150/200/240 fps [89 to 222 Mb/s] | XAVC-L 4:2:2 10-Bit | 1920 x 1080p from 1 to 59.94/100/150/200/240 fps [35 to 50 Mb/s] | XAVC-L 4:2:0 8-Bit | 3840 x 2160 from 1 to 59.94/100 fps [100 to 150 Mb/s]" + }, + { + "group": "Key Specs", + "label": "External Recording Modes", + "value": "Raw 16-Bit via SDI/BNC | 4096 x 2160 at 23.98/24.00/25/29.97/50/59.94 fps | 3840 x 2160 at 23.98/25/29.97/50/59.94 fps" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "Dual Slot: CFexpress Type A / SD (UHS-II)" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x BNC (12G-SDI) Output | 1x HDMI Output" + }, + { + "group": "Key Specs", + "label": "Mobile App Compatible", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Battery Type", + "value": "Sony BP-U Series" + }, + { + "group": "Imaging", + "label": "Lens Mount", + "value": "Sony E" + }, + { + "group": "Imaging", + "label": "Lens Communication", + "value": "Yes" + }, + { + "group": "Imaging", + "label": "Sensor Resolution", + "value": "Actual: 12.9 Megapixel | Effective: 10.2 Megapixel (1420 x 802)" + }, + { + "group": "Imaging", + "label": "Image Sensor", + "value": "Full-Frame CMOS" + }, + { + "group": "Imaging", + "label": "Image Stabilization", + "value": "No" + }, + { + "group": "Imaging", + "label": "Built-In ND Filter", + "value": "1/4 to 1/128 Stop Electronic ND Filter" + }, + { + "group": "Imaging", + "label": "Capture Type", + "value": "Stills & Video" + }, + { + "group": "Exposure Control", + "label": "Shutter Type", + "value": "Electronic Rolling Shutter" + }, + { + "group": "Exposure Control", + "label": "Shutter Speed", + "value": "1/8000 to 1 Second" + }, + { + "group": "Exposure Control", + "label": "ISO/Gain Sensitivity", + "value": "Native: 800 to 12,800 (320 to 409,600 Extended) | Gain: -3 to 18 dB dB" + }, + { + "group": "Exposure Control", + "label": "Shutter Angle", + "value": "5 to 360°" + }, + { + "group": "Exposure Control", + "label": "Advertised Dynamic Range", + "value": "15 Stops" + }, + { + "group": "Exposure Control", + "label": "White Balance", + "value": "Range: 2000 to 15,000K" + }, + { + "group": "Video Capture", + "label": "Internal Recording Modes", + "value": "XAVC-I 4:2:2 10-Bit | 4096 x 2160 from 1 to 59.94 fps [240 to 600 Mb/s] | 3840 x 2160 from 1 to 59.94/100 fps [240 to 600 Mb/s] | 1920 x 1080p from 1 to 59.94/100/150/200/240 fps [89 to 222 Mb/s] | XAVC-L 4:2:2 10-Bit | 1920 x 1080p from 1 to 59.94/100/150/200/240 fps [35 to 50 Mb/s] | XAVC-L 4:2:0 8-Bit | 3840 x 2160 from 1 to 59.94/100 fps [100 to 150 Mb/s]" + }, + { + "group": "Video Capture", + "label": "External Recording Modes", + "value": "Raw 16-Bit via SDI/BNC | 4096 x 2160 at 23.98/24.00/25/29.97/50/59.94 fps | 3840 x 2160 at 23.98/25/29.97/50/59.94 fps" + }, + { + "group": "Video Capture", + "label": "Fast-/Slow-Motion Support", + "value": "Yes" + }, + { + "group": "Video Capture", + "label": "Gamma Curve", + "value": "HDR-HLG, S Cinetone, Sony S-Log, Sony S-Log 3" + }, + { + "group": "Video Capture", + "label": "Built-In Microphone", + "value": "Stereo | Mono" + }, + { + "group": "Video Capture", + "label": "Audio Recording", + "value": "AVC-Intra: 2/4-Channel 24-Bit 48 kHz LPCM Audio | AVC-Long: 2/4-Channel 24-Bit 48 kHz LPCM Audio" + }, + { + "group": "Video Capture", + "label": "IP Streaming", + "value": "No" + }, + { + "group": "Interface", + "label": "Media/Memory Card Slot", + "value": "Dual Slot: CFexpress Type A / SD (UHS-II)" + }, + { + "group": "Interface", + "label": "Video I/O", + "value": "1x BNC (12G-SDI) Output | 1x HDMI Output" + }, + { + "group": "Interface", + "label": "Audio I/O", + "value": "2x XLR 3-Pin Mic/Line Input | 1x 1/8\" / 3.5 mm TRS Stereo Headphone Output" + }, + { + "group": "Interface", + "label": "Power I/O", + "value": "1x Barrel (19.5VDC) Input" + }, + { + "group": "Interface", + "label": "Other I/O", + "value": "1x BNC (Timecode) Input/Output | 1x USB-C | 1x Micro-USB | 1x 2.5 mm Sub-Mini (LANC) Control" + }, + { + "group": "Interface", + "label": "Wireless", + "value": "2.4 / 5 GHz Wi-Fi 5 (802.11ac)" + }, + { + "group": "Interface", + "label": "Mobile App Compatible", + "value": "No" + }, + { + "group": "Interface", + "label": "Global Positioning (GPS, GLONASS, etc.)", + "value": "No" + }, + { + "group": "Monitor", + "label": "Display Type", + "value": "Primary Monitor: Included External 3.5\" Touchscreen LCD" + }, + { + "group": "Monitor", + "label": "Resolution", + "value": "Primary Monitor: 1280 x 720 (2,760,000 Dot)" + }, + { + "group": "Viewfinder", + "label": "Type", + "value": "Optional, Not Included" + }, + { + "group": "Focus", + "label": "Focus Mode", + "value": "Automatic, Manual Focus" + }, + { + "group": "Power", + "label": "Battery Type", + "value": "Sony BP-U Series" + }, + { + "group": "Power", + "label": "Power Consumption", + "value": "18 W" + }, + { + "group": "Environmental", + "label": "Operating Conditions", + "value": "32 to 72°F / 0 to 40°C" + }, + { + "group": "Environmental", + "label": "Storage Conditions", + "value": "-4 to 140°F / -20 to 60°C" + }, + { + "group": "General", + "label": "Tripod Mounting Thread", + "value": "1/4\"-20 Female (Bottom) | 3/8\"-16 Female (Bottom)" + }, + { + "group": "General", + "label": "Accessory Mounting Thread", + "value": "4x 1/4\"-20 | 1x ARRI/Hirth Rosette" + }, + { + "group": "General", + "label": "Material of Construction", + "value": "Magnesium Alloy" + }, + { + "group": "General", + "label": "Dimensions (W x H x D)", + "value": "6 x 4.6 x 4.5\" / 153 x 116 x 114 mm (Without Protrusions)" + }, + { + "group": "General", + "label": "Weight", + "value": "2 lb / 890 g (Body Only)" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "9.87 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "12.1 x 11.6 x 11.6\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1600161-REG/sony_ilme_fx6vk_fx6_digital_cinema_camera.html", + "archive_url": "https://web.archive.org/web/20250622185618/https://www.bhphotovideo.com/c/product/1600161-REG/sony_ilme_fx6vk_fx6_digital_cinema_camera.html", + "archive_timestamp": "20250622185618", + "fetched_at": "2026-09-12T17:27:27Z" + } + }, + { + "slug": "atomos-sumo-19-se-hdr-monitor-recorder-and-switcher", + "name": "Atomos Sumo 19\" SE HDR Monitor, Recorder, and Switcher", + "brand": "Atomos", + "bh_sku": "ATSUMO19SE", + "mpn": "ATOMSUMSE1", + "department_slug": "pro-video", + "subcategory_slug": "monitors-recorders", + "product_type": "Field Monitor", + "price_usd": 1995.0, + "availability": "In Stock", + "condition": "New", + "description": "With an upgraded 19\" 1920 x 1080 IPS touchscreen display and 1200 cd/m² brightness, the Atomos Sumo 19\" SE HDR Monitor, Recorder, and Switcher maintains the same 4K recording, monitoring, and switching capabilities of its predecessor with a sharper and brighter display. Four 12G-SDI inputs and one HDMI 2.0 input can receive video signals up to 4K60 and support live quad-channel switching. Five-channel recording captures the input feeds as well as the live switching to create one output video for efficient viewing. Genlock and LTC timecode are also supported by the HDMI 2.0 and quad-SDI connections.", + "mount_type": null, + "sensor_size": null, + "focal_length": null, + "connectivity": null, + "megapixels": null, + "capacity_gb": null, + "image_path": null, + "image_sha256": null, + "specs": [ + { + "group": "Key Specs", + "label": "Display Size", + "value": "19.00\" / 48.3 cm" + }, + { + "group": "Key Specs", + "label": "Native Resolution", + "value": "1920 x 1080" + }, + { + "group": "Key Specs", + "label": "Touchscreen", + "value": "Yes" + }, + { + "group": "Key Specs", + "label": "HDR Support", + "value": "Yes, Hybrid Log Gamma" + }, + { + "group": "Key Specs", + "label": "Video I/O", + "value": "1x HDMI 2.0 Input | 1x HDMI 2.0 Output | 4x BNC (12G-SDI) Input | 1x BNC (12G-SDI) Output" + }, + { + "group": "Key Specs", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "Key Specs", + "label": "Video Format", + "value": "HDMI/SDI (10-Bit 4:2:2) | UHD 4K: 60 | DCI 4K: 60" + }, + { + "group": "Key Specs", + "label": "Phantom Power", + "value": "+48 V" + }, + { + "group": "Key Specs", + "label": "Battery", + "value": "Interchangeable Mount (No Plate Included)" + }, + { + "group": "Key Specs", + "label": "Power Consumption", + "value": "75 W" + }, + { + "group": "Display", + "label": "Panel Type", + "value": "IPS-Type LCD" + }, + { + "group": "Display", + "label": "Display Size", + "value": "19.00\" / 48.3 cm" + }, + { + "group": "Display", + "label": "Native Resolution", + "value": "1920 x 1080" + }, + { + "group": "Display", + "label": "Aspect Ratio", + "value": "16:9" + }, + { + "group": "Display", + "label": "Touchscreen", + "value": "Yes" + }, + { + "group": "Display", + "label": "Maximum Brightness", + "value": "1200 nits / cd/m2" + }, + { + "group": "Display", + "label": "Color Support", + "value": "1.07 Billion Colors (8-Bit+FRC)" + }, + { + "group": "Display", + "label": "HDR Support", + "value": "Yes, Hybrid Log Gamma" + }, + { + "group": "Display", + "label": "LUT Support", + "value": "Yes" + }, + { + "group": "Display", + "label": "Image Controls", + "value": "Anamorphic De-Squeeze, False Color, Focus Peaking, OSD Flip, Pixel Zoom, RGB Parade, Vectorscope, Waveform, Zebra" + }, + { + "group": "Inputs/Outputs", + "label": "Video I/O", + "value": "1x HDMI 2.0 Input | 1x HDMI 2.0 Output | 4x BNC (12G-SDI) Input | 1x BNC (12G-SDI) Output" + }, + { + "group": "Inputs/Outputs", + "label": "Embedded Audio", + "value": "HDMI: 8-Channel | SDI: 12-Channel" + }, + { + "group": "Inputs/Outputs", + "label": "Audio I/O", + "value": "2x XLR Input | 2x XLR Output | 1x 1/8\" / 3.5 mm Headphone Output" + }, + { + "group": "Inputs/Outputs", + "label": "Built-In Speaker", + "value": "Stereo" + }, + { + "group": "Inputs/Outputs", + "label": "Power I/O", + "value": "2x XLR 4-Pin (14.4 VDC) Input | 1x XLR 4-Pin (16.8 VDC) Input" + }, + { + "group": "Inputs/Outputs", + "label": "Other I/O", + "value": "1x BNC (Genlock) Input | 1x 2.5 mm (LANC) Input" + }, + { + "group": "Inputs/Outputs", + "label": "Media/Memory Card Slot", + "value": "No" + }, + { + "group": "Inputs/Outputs", + "label": "Wi-Fi", + "value": "No" + }, + { + "group": "Inputs/Outputs", + "label": "Bluetooth", + "value": "No" + }, + { + "group": "Inputs/Outputs", + "label": "Mobile App Compatible", + "value": "No" + }, + { + "group": "Format Support", + "label": "Video Format", + "value": "HDMI/SDI (10-Bit 4:2:2) | UHD 4K: 60 | DCI 4K: 60" + }, + { + "group": "Format Support", + "label": "Gamma Curve", + "value": "DCI-P3, DCI-P3+, Panasonic V-Gamut, Rec709" + }, + { + "group": "Format Support", + "label": "Video Signal Conversion", + "value": "HDMI to SDI | | SDI to HDMI |" + }, + { + "group": "Format Support", + "label": "Timecode Support", + "value": "Yes" + }, + { + "group": "Recording", + "label": "Pulldown Conversion", + "value": "2:2, 3:2" + }, + { + "group": "Recording", + "label": "Camera Trigger", + "value": "SDI, HDMI" + }, + { + "group": "Recording", + "label": "Pre-Roll Record", + "value": "Full HD: 8 Seconds | 4K: 2 Seconds" + }, + { + "group": "Recording", + "label": "Encoding Formats", + "value": "x | ProRes Raw | ProRes 422 HQ 10-Bit | DNxHR 422 HQ 10-Bit" + }, + { + "group": "Recording", + "label": "Closed Caption Support", + "value": "No" + }, + { + "group": "Recording", + "label": "Reference Input", + "value": "No" + }, + { + "group": "Recording", + "label": "Phantom Power", + "value": "+48 V" + }, + { + "group": "Power", + "label": "Input Power", + "value": "12 to 16.8 VDC" + }, + { + "group": "Power", + "label": "Battery", + "value": "Interchangeable Mount (No Plate Included)" + }, + { + "group": "Power", + "label": "Power Consumption", + "value": "75 W" + }, + { + "group": "Mounting", + "label": "VESA Mounting-Hole Pattern", + "value": "100 x 100 mm" + }, + { + "group": "Mounting", + "label": "Tripod/Accessory Mounting", + "value": "10x 1/4\"-20 Female | 5x 3/8\"-16 Female" + }, + { + "group": "General", + "label": "Material of Construction", + "value": "Aluminum, Polycarbonate" + }, + { + "group": "General", + "label": "Dimensions", + "value": "19.8 x 13 x 7.1\" / 504 x 330 x 180 mm (Including Feet) | 19.8 x 12.2 x 2.5\" / 504 x 310 x 63 mm (Excluding Feet)" + }, + { + "group": "General", + "label": "Weight", + "value": "12.02 lb / 5.45 kg" + }, + { + "group": "Packaging Info", + "label": "Package Weight", + "value": "21.3 lb" + }, + { + "group": "Packaging Info", + "label": "Box Dimensions (LxWxH)", + "value": "24 x 15.25 x 7.25\"" + } + ], + "source": { + "original_url": "https://www.bhphotovideo.com/c/product/1702616-REG/atomos_atomsumse1_sumo_19_se_19.html", + "archive_url": "https://web.archive.org/web/20250316215151/https://www.bhphotovideo.com/c/product/1702616-REG/atomos_atomsumse1_sumo_19_se_19.html", + "archive_timestamp": "20250316215151", + "fetched_at": "2026-09-12T17:27:27Z" + } + } + ] +} diff --git a/sites/bh_photo/sources/build_manifest.py b/sites/bh_photo/sources/build_manifest.py new file mode 100644 index 000000000..daf9e0ffb --- /dev/null +++ b/sites/bh_photo/sources/build_manifest.py @@ -0,0 +1,307 @@ +#!/usr/bin/env python3 +"""Turn harvested archive records into the reviewed source manifest the seed reads. + +`harvest.py` writes one raw record per archived product page. This step selects +the records the mirror ships, derives the filter fields the app needs from the +published specification table (never by invention), and writes +`sites/bh_photo/source_catalog.json` with per-product provenance. + +A field that cannot be read from the source is written as null. Downstream code +treats null as "not stated by the source" and the review report lists those gaps. +""" + +from __future__ import annotations + +import argparse +import json +import re +from collections import defaultdict +from datetime import datetime, timezone +from pathlib import Path + +# Upstream department labels, taken from the bhphotovideo.com nav strip. +DEPARTMENTS = { + "photography": { + "name": "Photography", "nav_order": 1, + "children": ["mirrorless-cameras", "dslr-cameras", "camera-lenses", + "tripods-supports", "memory-cards-storage"], + }, + "computers": { + "name": "Computers", "nav_order": 2, + "children": ["laptops", "monitors", "printers-scanners"], + }, + "pro-video": { + "name": "Pro Video", "nav_order": 3, + "children": ["cinema-cameras", "monitors-recorders"], + }, + "lighting": {"name": "Lighting", "nav_order": 4, "children": ["lighting-kits"]}, + "pro-audio": {"name": "Pro Audio", "nav_order": 5, "children": ["microphones", "headphones"]}, + "drones": {"name": "Drones", "nav_order": 6, "children": ["drones"]}, +} + +SUBCATEGORY_NAMES = { + "mirrorless-cameras": "Mirrorless Cameras", "dslr-cameras": "DSLR Cameras", + "camera-lenses": "Lenses", "tripods-supports": "Tripods & Support", + "memory-cards-storage": "Memory Cards & Storage", "cinema-cameras": "Cinema Cameras", + "monitors-recorders": "Monitors & Recorders", "microphones": "Microphones", + "headphones": "Headphones", "laptops": "Laptops", "monitors": "Monitors", + "printers-scanners": "Printers & Scanners", "lighting-kits": "Lighting", + "drones": "Drones", +} + +PRODUCT_TYPES = { + "mirrorless-cameras": "Mirrorless Camera", "dslr-cameras": "DSLR Camera", + "camera-lenses": "Lens", "tripods-supports": "Tripod", "memory-cards-storage": "Storage", + "cinema-cameras": "Cinema Camera", "monitors-recorders": "Field Monitor", + "microphones": "Microphone", "headphones": "Headphones", "laptops": "Laptop", + "monitors": "Monitor", "printers-scanners": "Printer", "lighting-kits": "Light", + "drones": "Drone", +} + +# spec label -> manifest field. Labels are the ones B&H publishes. +SPEC_FIELDS = { + "mount_type": ("Lens Mount", "Mount", "Lens Mount(s)"), + "sensor_size": ("Sensor Type", "Sensor Size", "Image Sensor"), + "focal_length": ("Focal Length", "Focal Length Range"), + "connectivity": ("Connectivity", "Wireless", "Interface", "I/O"), +} + + +# The archive index is matched on URL slugs, which puts pouches, adapters and +# conferencing cameras into the wrong shelf. Classification is redone here from +# the product name, which is the text a shopper actually sees. +ACCESSORY_PATTERNS = re.compile( + r"\b(pouch|case|bag|backpack|strap|cap|hood|cleaning|wipe|blower|screen protector|" + r"battery grip|adapter ring|step-up|filter kit|lens cap|dust|plate only|l-bracket|" + r"cable|extension kit|spare|replacement|refill|cartridge|toner|paper|ink)\b", re.I) + +NAME_RULES = [ + ("drones", r"\b(drone|quadcopter)\b"), + ("cinema-cameras", r"\bcinema camera\b"), + ("mirrorless-cameras", r"\bmirrorless camera\b"), + ("dslr-cameras", r"\bdslr\b"), + ("memory-cards-storage", r"\b(cfexpress|sdxc|microsdxc|microsd|memory card|ssd|nas|card reader)\b"), + ("laptops", r"\b(laptop|macbook|notebook)\b"), + ("printers-scanners", r"\b(printer|scanner)\b"), + ("headphones", r"\b(headphone|earphone|in-ear monitor)\b"), + ("microphones", r"\b(microphone|shotgun mic|lavalier|wireless mic|\bmic\b)"), + ("monitors-recorders", r"\b(field monitor|recorder|on-camera monitor)\b"), + ("monitors", r"\bmonitor\b"), + ("tripods-supports", r"\b(tripod|monopod|gimbal|slider|fluid head|support)\b"), + ("lighting-kits", r"\b(led (panel|light|monolight)|softbox|light kit|monolight|strobe|" + r"light panel|cob light|spotlight)\b"), + ("camera-lenses", r"\blens\b"), +] + + +def reclassify(record: dict) -> str | None: + """Return the shelf a product belongs on, or None to drop it.""" + name = record.get("name") or "" + if ACCESSORY_PATTERNS.search(name): + return None + for subcategory, pattern in NAME_RULES: + if re.search(pattern, name, re.I): + # a camera that merely ships "with ... Lens" is still a camera + if subcategory == "camera-lenses" and re.search(r"\bcamera\b", name, re.I): + return None + return subcategory + # no name rule matched: keep the shelf the archive URL implied + return record.get("subcategory") + + +def slugify(text: str) -> str: + text = re.sub(r"[^a-z0-9]+", "-", text.lower()) + return re.sub(r"-{2,}", "-", text).strip("-")[:200] + + +def spec_lookup(specs: list[dict], labels: tuple[str, ...]) -> str | None: + for label in labels: + for row in specs: + if row["label"].strip().lower() == label.lower(): + return row["value"] + return None + + +def parse_megapixels(specs: list[dict], name: str) -> float | None: + """Read effective megapixels from the published sensor resolution row.""" + value = spec_lookup(specs, ("Sensor Resolution", "Effective Pixels", "Resolution")) + if value: + effective = re.search(r"Effective:\s*([\d.]+)\s*Megapixel", value, re.I) + if effective: + return float(effective.group(1)) + plain = re.search(r"([\d.]+)\s*(?:MP|Megapixel)", value, re.I) + if plain: + return float(plain.group(1)) + return None + + +def parse_capacity_gb(specs: list[dict], name: str) -> int | None: + value = spec_lookup(specs, ("Capacity", "Storage Capacity", "Internal Storage")) + for candidate in (value, name): + if not candidate: + continue + match = re.search(r"(\d+(?:\.\d+)?)\s*(TB|GB)\b", candidate, re.I) + if match: + size = float(match.group(1)) + return int(size * 1024) if match.group(2).upper() == "TB" else int(size) + return None + + +def condition_label(raw: str | None) -> str: + return {"NewCondition": "New", "UsedCondition": "Used", + "RefurbishedCondition": "Refurbished", "DamagedCondition": "Open-Box"}.get(raw or "", "New") + + +def availability_label(raw: str | None) -> str: + return {"InStock": "In Stock", "OutOfStock": "Out of Stock", + "Discontinued": "Discontinued", "PreOrder": "Pre-Order", + "BackOrder": "Backordered"}.get(raw or "", "In Stock") + + +def select_subcategory(items: list[dict], limit: int, per_brand: int, + imaged: set[str] | None = None) -> list[dict]: + """Pick a realistic shelf for one subcategory. + + A catalog that is all accessories makes price filters and comparisons + meaningless, and a catalog that is all flagships has no distractors. Stocked + items come first, the shelf is built from both ends of the price range, and + no single brand may dominate it. + """ + imaged = imaged or set() + + def has_image(record: dict) -> bool: + key = re.sub(r"[^A-Za-z0-9_-]+", "-", str(record.get("bh_sku") or "")).strip("-").lower() + return key in imaged + + stocked = [r for r in items if (r.get("availability") or "") == "InStock"] + pool = stocked or items + # a shelf of placeholders is not a mirror: products whose photo the archive + # actually holds are preferred, and the rest only fill what is left over + with_photo = [r for r in pool if has_image(r)] + without_photo = [r for r in pool if not has_image(r)] + pool = with_photo + without_photo + priced = sorted((r for r in pool if r.get("price_usd")), + key=lambda r: (not has_image(r), -r["price_usd"])) + unpriced = [r for r in pool if not r.get("price_usd")] + + top_share = max(1, round(limit * 0.65)) + ordered = (priced[:top_share] + priced[-(limit - top_share):][::-1] + if len(priced) > limit else list(priced)) + ordered += [r for r in priced if r not in ordered] + ordered += unpriced + + chosen, brand_counts = [], defaultdict(int) + for record in ordered: + brand = (record.get("brand") or "?").lower() + if brand_counts[brand] >= per_brand: + continue + brand_counts[brand] += 1 + chosen.append(record) + if len(chosen) >= limit: + break + # if the brand cap starved the shelf, refill in price order + if len(chosen) < limit: + for record in ordered: + if record not in chosen: + chosen.append(record) + if len(chosen) >= limit: + break + return chosen + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--catalog", required=True) + parser.add_argument("--assets", required=True, help="asset_inventory.json from harvest images") + parser.add_argument("--out", required=True) + parser.add_argument("--max-per-subcategory", type=int, default=14) + parser.add_argument("--min-specs", type=int, default=4) + parser.add_argument("--max-per-brand", type=int, default=4) + args = parser.parse_args() + + records = json.loads(Path(args.catalog).read_text()) + assets = json.loads(Path(args.assets).read_text()) if Path(args.assets).exists() else {} + imaged_keys = set(assets) + + by_subcategory: dict[str, list[dict]] = defaultdict(list) + seen_names: set[str] = set() + dropped: list[str] = [] + for record in records: + name = (record.get("name") or "").strip() + key = name.lower() + if not name or key in seen_names: + continue + if len(record.get("specs") or []) < args.min_specs: + continue + subcategory = reclassify(record) + if not subcategory: + dropped.append(name) + continue + seen_names.add(key) + record = dict(record, subcategory=subcategory) + by_subcategory[subcategory].append(record) + + parent_of = {child: slug for slug, dept in DEPARTMENTS.items() for child in dept["children"]} + products = [] + for subcategory, items in by_subcategory.items(): + for record in select_subcategory(items, args.max_per_subcategory, + args.max_per_brand, imaged_keys): + sku = record.get("bh_sku") + asset_key = re.sub(r"[^A-Za-z0-9_-]+", "-", str(sku or "")).strip("-").lower() + asset = assets.get(asset_key) + specs = record["specs"] + products.append({ + "slug": slugify(record["name"]), + "name": record["name"], + "brand": record.get("brand") or "B&H", + "bh_sku": sku, + "mpn": record.get("mpn"), + "department_slug": parent_of[subcategory], + "subcategory_slug": subcategory, + "product_type": PRODUCT_TYPES[subcategory], + "price_usd": record.get("price_usd"), + "availability": availability_label(record.get("availability")), + "condition": condition_label(record.get("item_condition")), + "description": record.get("description"), + "mount_type": spec_lookup(specs, SPEC_FIELDS["mount_type"]), + "sensor_size": spec_lookup(specs, SPEC_FIELDS["sensor_size"]), + "focal_length": spec_lookup(specs, SPEC_FIELDS["focal_length"]), + "connectivity": spec_lookup(specs, SPEC_FIELDS["connectivity"]), + "megapixels": parse_megapixels(specs, record["name"]), + "capacity_gb": parse_capacity_gb(specs, record["name"]), + "image_path": asset["file"] if asset else None, + "image_sha256": asset["sha256"] if asset else None, + "specs": specs, + "source": record["source"], + }) + + products.sort(key=lambda p: (p["department_slug"], p["subcategory_slug"], p["name"])) + manifest = { + "generated_at": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), + "upstream": "https://www.bhphotovideo.com/", + "method": ("Catalog facts read from dated Internet Archive captures of bhphotovideo.com; " + "the live site answers automated requests with a bot challenge. Each product " + "record carries the capture URL and timestamp it was read from. Fields the " + "source does not state are null. Accounts, reviews, questions, bundles, store " + "locations, carts and orders are NOT sourced - they are declared " + "benchmark-synthetic state generated by seed_data.py."), + "departments": DEPARTMENTS, + "subcategory_names": SUBCATEGORY_NAMES, + "product_count": len(products), + "products": products, + } + Path(args.out).write_text(json.dumps(manifest, indent=1, ensure_ascii=False) + "\n") + + with_price = sum(1 for p in products if p["price_usd"] is not None) + with_image = sum(1 for p in products if p["image_path"]) + print(f"{len(products)} products -> {args.out} ({len(dropped)} accessory/unclassified records dropped)") + print(f" priced {with_price}/{len(products)} imaged {with_image}/{len(products)} " + f"specs avg {sum(len(p['specs']) for p in products)/max(1,len(products)):.1f}") + for department, spec in DEPARTMENTS.items(): + count = sum(1 for p in products if p["department_slug"] == department) + print(f" {spec['name']:14s} {count:3d}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/sites/bh_photo/sources/harvest.py b/sites/bh_photo/sources/harvest.py new file mode 100644 index 000000000..553abe31c --- /dev/null +++ b/sites/bh_photo/sources/harvest.py @@ -0,0 +1,405 @@ +#!/usr/bin/env python3 +"""Harvest B&H catalog facts from Internet Archive snapshots of bhphotovideo.com. + +The live site answers automated requests with a bot challenge, so every fact in +this mirror's seed is taken from a dated Wayback Machine capture instead. Each +record keeps the capture URL and timestamp so a reviewer can open the same page. + +Only catalog facts are harvested: product name, brand, B&H SKU, manufacturer +part number, price, availability, condition, description and the published +specification table. Customer reviews, questions, accounts and orders are NOT +harvested; the mirror generates those as declared benchmark-synthetic state. + +Usage: + python3 harvest.py discover --prefixes 15,16,17,18,19 --out candidates.json + python3 harvest.py fetch --candidates candidates.json --raw-dir RAW --out catalog.json + python3 harvest.py images --catalog catalog.json --out-dir IMG --manifest asset_inventory.json +""" + +from __future__ import annotations + +import argparse +import html +import json +import re +import sys +import time +import urllib.parse +import urllib.request +from datetime import datetime, timezone +from pathlib import Path + +CDX = "https://web.archive.org/cdx/search/cdx" +WAYBACK = "https://web.archive.org/web" +UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0 Safari/537.36" + +# Mirror subcategory -> keywords matched against the archived product URL slug. +CATEGORY_QUERIES = { + "mirrorless-cameras": ["mirrorless"], + "dslr-cameras": ["dslr", "eos_5d", "eos_6d", "d850", "d780"], + "camera-lenses": ["_lens", "lens_"], + "tripods-supports": ["tripod", "monopod", "gimbal"], + "memory-cards-storage": ["sdxc", "cfexpress", "microsd", "_ssd"], + "cinema-cameras": ["cinema_camera", "cinema_"], + "drones": ["drone", "quadcopter"], + "monitors-recorders": ["field_monitor", "recorder_monitor", "atomos"], + "microphones": ["microphone", "_mic_", "shotgun"], + "headphones": ["headphone"], + "laptops": ["macbook", "_laptop", "thinkpad", "xps_"], + "monitors": ["_monitor_", "display_monitor"], + "printers-scanners": ["printer", "scanner"], + "lighting-kits": ["_light_", "led_light", "softbox", "strobe"], +} + + +def get(url: str, timeout: int = 90) -> str: + request = urllib.request.Request(url, headers={"User-Agent": UA}) + with urllib.request.urlopen(request, timeout=timeout) as response: + return response.read().decode("utf-8", "replace") + + +def cdx_prefix(prefix: str, limit: int, since: str) -> list[tuple[str, str]]: + """Pull one page of the archive index for product IDs starting with `prefix`. + + Server-side regex filtering across the whole product namespace times out, so + the index is pulled in ID-prefix blocks and filtered locally. B&H product IDs + ascend with recency, so higher prefixes reach current gear. + """ + params = { + "url": f"bhphotovideo.com/c/product/{prefix}", + "matchType": "prefix", + "output": "text", + "fl": "timestamp,original", + "filter": "statuscode:200", + "collapse": "urlkey", + "limit": str(limit), + "from": since, + } + query = urllib.parse.urlencode(params, doseq=True) + rows = [] + for line in get(f"{CDX}?{query}").splitlines(): + parts = line.split() + if len(parts) != 2: + continue + timestamp, original = parts + if "?" in original or not original.endswith(".html"): + continue + if original.rstrip("/").count("/") > 6: + continue + rows.append((timestamp, original)) + return rows + + +def classify(url: str) -> str | None: + """Map an archived product URL slug onto one of the mirror's subcategories.""" + slug = url.rsplit("/", 1)[-1].lower() + for subcategory, keywords in CATEGORY_QUERIES.items(): + if any(keyword in slug for keyword in keywords): + return subcategory + return None + + +def strip_tags(fragment: str) -> str: + fragment = re.sub(r"", " | ", fragment) + fragment = re.sub(r"<[^>]+>", "", fragment) + return html.unescape(fragment).strip() + + +def unwayback(url: str | None) -> str | None: + """Turn an archive-rewritten asset URL back into its original address.""" + if not url: + return None + match = re.search(r"/web/\d+(?:[a-z_]+)?/(https?://.*)$", url) + return match.group(1) if match else url + + +def parse_product(page: str, archive_url: str, original_url: str, timestamp: str) -> dict | None: + product = None + for block in re.findall(r']*application/ld\+json[^>]*>(.*?)', page, re.S): + try: + data = json.loads(html.unescape(block.strip())) + except json.JSONDecodeError: + continue + for item in data if isinstance(data, list) else [data]: + if isinstance(item, dict) and item.get("@type") == "Product": + product = item + break + if product: + break + if not product: + return None + + offers = product.get("offers") or {} + if isinstance(offers, list): + offers = offers[0] if offers else {} + price = offers.get("price") + try: + price = float(price) if price not in (None, "") else None + except (TypeError, ValueError): + price = None + + brand = product.get("brand") + if isinstance(brand, dict): + brand = brand.get("name") + + # The specification block does not label every group on every page, so the + # rows are collected across the whole block and each one is attributed to the + # nearest preceding group heading. + specs = [] + block = page + start = page.find('productSpecs_') + if start != -1: + end = page.find('class="reviews_', start) + block = page[start:end if end != -1 else len(page)] + groups = [(m.start(), strip_tags(m.group(1))) for m in re.finditer( + r'data-selenium="specsItemGroupName"[^>]*>(.*?)', block, re.S)] + for row in re.finditer( + r'data-selenium="specsItemGroupTableColumnLabel"[^>]*>(.*?).*?' + r'data-selenium="specsItemGroupTableColumnValue"[^>]*>(.*?)', + block, re.S, + ): + label, value = strip_tags(row.group(1)), strip_tags(row.group(2)) + if not label or not value: + continue + group_name = "Specifications" + for position, name in groups: + if position < row.start(): + group_name = name + else: + break + specs.append({"group": group_name, "label": label, "value": value}) + + images = product.get("image") + if isinstance(images, str): + images = [images] + images = [unwayback(u) for u in (images or [])] + + return { + "name": html.unescape(str(product.get("name") or "")).strip(), + "brand": brand, + "bh_sku": product.get("sku"), + "mpn": product.get("mpn"), + "description": strip_tags(str(product.get("description") or ""))[:1200] or None, + "price_usd": price, + "price_currency": offers.get("priceCurrency"), + "availability": (offers.get("availability") or "").rsplit("/", 1)[-1] or None, + "item_condition": (offers.get("itemCondition") or "").rsplit("/", 1)[-1] or None, + "images": images, + "specs": specs, + "source": { + "original_url": original_url, + "archive_url": archive_url, + "archive_timestamp": timestamp, + "fetched_at": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), + }, + } + + +def cmd_discover(args: argparse.Namespace) -> int: + candidates: dict[str, dict] = {} + counts: dict[str, int] = {} + for prefix in args.prefixes.split(","): + prefix = prefix.strip() + if not prefix: + continue + try: + rows = cdx_prefix(prefix, args.per_prefix, args.since) + except Exception as error: # noqa: BLE001 - report and continue + print(f" ! prefix {prefix}: {error}", file=sys.stderr) + continue + matched = 0 + for timestamp, original in rows: + subcategory = classify(original) + if not subcategory: + continue + matched += 1 + counts[subcategory] = counts.get(subcategory, 0) + 1 + candidates.setdefault(original, { + "original_url": original, "archive_timestamp": timestamp, + "subcategory": subcategory, + }) + print(f" prefix {prefix}: {len(rows)} archived pages, {matched} classified", file=sys.stderr) + time.sleep(args.delay) + Path(args.out).write_text(json.dumps(list(candidates.values()), indent=1)) + for subcategory in sorted(counts, key=counts.get, reverse=True): + print(f" {subcategory:26s} {counts[subcategory]}", file=sys.stderr) + print(f"{len(candidates)} unique candidate product pages -> {args.out}") + return 0 + + +def cmd_reparse(args: argparse.Namespace) -> int: + """Rebuild the catalog from cached pages, without touching the network.""" + candidates = {c["original_url"]: c for c in json.loads(Path(args.candidates).read_text())} + catalog = [] + misses = 0 + for cache in sorted(Path(args.raw_dir).glob("*.html")): + page = cache.read_text(encoding="utf-8", errors="replace") + original = next((u for u in candidates + if re.sub(r"[^A-Za-z0-9]+", "_", u)[-120:] + ".html" == cache.name), None) + if not original: + misses += 1 + continue + candidate = candidates[original] + timestamp = candidate["archive_timestamp"] + record = parse_product(page, f"{WAYBACK}/{timestamp}/{original}", original, timestamp) + if not record or not record["name"]: + misses += 1 + continue + record["subcategory"] = candidate["subcategory"] + catalog.append(record) + Path(args.out).write_text(json.dumps(catalog, indent=1)) + counts = [len(r["specs"]) for r in catalog] + print(f"{len(catalog)} products reparsed ({misses} unmatched) -> {args.out}") + print(f" specs: min {min(counts)} median {sorted(counts)[len(counts)//2]} max {max(counts)} " + f"| under 4: {sum(1 for c in counts if c < 4)}") + return 0 + + +def cmd_images(args: argparse.Namespace) -> int: + """Download the archived product photography referenced by the catalog. + + Wayback serves the original bytes under the `im_` modifier, so each image + keeps the pixels the upstream product page showed at capture time. + """ + catalog = json.loads(Path(args.catalog).read_text()) + out_dir = Path(args.out_dir) + out_dir.mkdir(parents=True, exist_ok=True) + manifest_path = Path(args.manifest) + manifest = json.loads(manifest_path.read_text()) if manifest_path.exists() else {} + + saved = skipped = failed = 0 + for record in catalog: + images = record.get("images") or [] + if not images: + continue + sku = record.get("bh_sku") or record["source"]["original_url"].rsplit("/", 2)[1] + key = re.sub(r"[^A-Za-z0-9_-]+", "-", str(sku)).strip("-").lower() + target = out_dir / f"{key}.jpg" + if key in manifest and target.exists(): + skipped += 1 + continue + timestamp = record["source"]["archive_timestamp"] + # the page's own capture may predate any capture of its image, so fall + # back to the nearest capture the archive holds + attempts = [f"{WAYBACK}/{timestamp}im_/{images[0]}", + f"{WAYBACK}/2026im_/{images[0]}", + f"{WAYBACK}/im_/{images[0]}"] + try: + blob = None + last_error: Exception | None = None + for image_url in attempts: + try: + request = urllib.request.Request(image_url, headers={"User-Agent": UA}) + with urllib.request.urlopen(request, timeout=90) as response: + candidate_blob = response.read() + if len(candidate_blob) < 2000 or not candidate_blob.startswith((b"\xff\xd8", b"\x89PNG")): + raise ValueError(f"not an image ({len(candidate_blob)} bytes)") + blob = candidate_blob + break + except Exception as attempt_error: # noqa: BLE001 - try the next capture + last_error = attempt_error + time.sleep(args.delay) + if blob is None: + raise last_error or ValueError("no capture found") + target.write_bytes(blob) + manifest[key] = { + "file": f"images/products/{key}.jpg", + "bytes": len(blob), + "sha256": __import__("hashlib").sha256(blob).hexdigest(), + "original_image_url": images[0], + "archive_image_url": image_url, + "product": record["name"], + } + saved += 1 + print(f" {saved:4d} {key:28s} {len(blob)//1024:5d} KB {record['name'][:46]}", file=sys.stderr) + time.sleep(args.delay) + except Exception as error: # noqa: BLE001 + failed += 1 + print(f" ! {key}: {error}", file=sys.stderr) + if saved % 10 == 0: + manifest_path.write_text(json.dumps(manifest, indent=1, sort_keys=True)) + manifest_path.write_text(json.dumps(manifest, indent=1, sort_keys=True)) + print(f"images saved={saved} reused={skipped} failed={failed} -> {out_dir}") + return 0 + + +def cmd_fetch(args: argparse.Namespace) -> int: + candidates = json.loads(Path(args.candidates).read_text()) + raw_dir = Path(args.raw_dir) + raw_dir.mkdir(parents=True, exist_ok=True) + out_path = Path(args.out) + catalog = json.loads(out_path.read_text()) if out_path.exists() else [] + done = {record["source"]["original_url"] for record in catalog} + + for index, candidate in enumerate(candidates, 1): + original = candidate["original_url"] + if original in done: + continue + if args.limit and len(catalog) >= args.limit: + break + timestamp = candidate["archive_timestamp"] + archive_url = f"{WAYBACK}/{timestamp}/{original}" + cache = raw_dir / (re.sub(r"[^A-Za-z0-9]+", "_", original)[-120:] + ".html") + try: + page = cache.read_text(encoding="utf-8", errors="replace") if cache.exists() else get(archive_url) + if not cache.exists(): + cache.write_text(page, encoding="utf-8") + time.sleep(args.delay) + except Exception as error: # noqa: BLE001 + print(f" ! {index} {original[-60:]}: {error}", file=sys.stderr) + continue + record = parse_product(page, archive_url, original, timestamp) + if not record or not record["name"]: + print(f" - {index} no product data: {original[-60:]}", file=sys.stderr) + continue + record["subcategory"] = candidate["subcategory"] + catalog.append(record) + done.add(original) + if len(catalog) % 10 == 0: + out_path.write_text(json.dumps(catalog, indent=1)) + print(f" {len(catalog):4d} {record['brand']} | {record['name'][:58]} | " + f"${record['price_usd']} | {len(record['specs'])} specs", file=sys.stderr) + out_path.write_text(json.dumps(catalog, indent=1)) + print(f"{len(catalog)} products -> {out_path}") + return 0 + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + sub = parser.add_subparsers(dest="command", required=True) + + discover = sub.add_parser("discover") + discover.add_argument("--out", default="candidates.json") + discover.add_argument("--prefixes", default="15,16,17,18,19") + discover.add_argument("--per-prefix", type=int, default=2500) + discover.add_argument("--since", default="2026") + discover.add_argument("--delay", type=float, default=1.0) + discover.set_defaults(func=cmd_discover) + + fetch = sub.add_parser("fetch") + fetch.add_argument("--candidates", default="candidates.json") + fetch.add_argument("--raw-dir", required=True) + fetch.add_argument("--out", default="catalog.json") + fetch.add_argument("--limit", type=int, default=0) + fetch.add_argument("--delay", type=float, default=1.5) + fetch.set_defaults(func=cmd_fetch) + + images = sub.add_parser("images") + images.add_argument("--catalog", default="catalog.json") + images.add_argument("--out-dir", required=True) + images.add_argument("--manifest", required=True) + images.add_argument("--delay", type=float, default=1.0) + images.set_defaults(func=cmd_images) + + reparse = sub.add_parser("reparse") + reparse.add_argument("--candidates", required=True) + reparse.add_argument("--raw-dir", required=True) + reparse.add_argument("--out", required=True) + reparse.set_defaults(func=cmd_reparse) + + args = parser.parse_args() + return args.func(args) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/sites/bh_photo/static/css/main.css b/sites/bh_photo/static/css/main.css index 4dc0218d7..2dfaac80e 100644 --- a/sites/bh_photo/static/css/main.css +++ b/sites/bh_photo/static/css/main.css @@ -1186,3 +1186,61 @@ textarea { min-height: auto; } } + + +/* Department row. Upstream fronts its home page with a row of circular + department thumbnails carrying real product photography; this mirrors that + shape rather than the marketing hero the contribution shipped. */ +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0 0 0 0); + white-space: nowrap; + border: 0; +} + +.department-strip { + padding: 28px 0 8px; +} + +.department-row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(120px, 100%), 1fr)); + gap: 18px; +} + +.department-tile { + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + text-align: center; + font-size: 14px; + color: var(--text); +} + +.department-thumb { + display: flex; + align-items: center; + justify-content: center; + width: 104px; + height: 104px; + border-radius: 50%; + background: #fafafa; + overflow: hidden; +} + +.department-thumb img { + width: 100%; + height: 100%; + object-fit: contain; + padding: 10px; +} + +.department-tile:hover strong { + text-decoration: underline; +} diff --git a/sites/bh_photo/static/icons/product-placeholder.svg b/sites/bh_photo/static/icons/product-placeholder.svg new file mode 100644 index 000000000..05b6cb3e9 --- /dev/null +++ b/sites/bh_photo/static/icons/product-placeholder.svg @@ -0,0 +1,10 @@ + + + + + + + + + Image not archived + diff --git a/sites/bh_photo/templates/index.html b/sites/bh_photo/templates/index.html index 40d8f05fe..6f85f1e1f 100644 --- a/sites/bh_photo/templates/index.html +++ b/sites/bh_photo/templates/index.html @@ -1,44 +1,19 @@ {% extends "base.html" %} {% block title %}B&H Photo Demo Mirror{% endblock %} {% block content %} -
-
-
-

Creator gear, local only

-

Professional photo, video, audio, and computing workflows in a benchmark-ready B&H mirror.

-

Browse rich technical specs, compare models side by side, reserve pickup locally, and run a complete checkout flow without any external calls.

- -
-
-
-

Today’s local mirror highlights

-
    -
  • 146 synthetic products with dense specs and compare-friendly rows
  • -
  • 20 bundles, 8 pickup locations, and deterministic checkout history
  • -
  • Used and open-box gear mixed into search, deals, and brand pages
  • -
-
-
-
-
- -
-
-
-

Top categories

-

Browse by department

-
- View all -
-
+
+

B&H Photo Video

+ From 172e05e35c3e9858c46768f821a2d37677ae4c9c Mon Sep 17 00:00:00 2001 From: JackJin <1037461232@qq.com> Date: Sun, 13 Sep 2026 01:29:43 +0800 Subject: [PATCH 06/29] style(bh_photo): use retail page copy instead of mirror commentary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every page title read "· B&H Demo Mirror", the logo lockup said DEMO MIRROR, and page intros described the site as a benchmark environment ("designed for cart and checkout benchmark tasks", "synthetic mirror content"). Generated rows carried the same commentary into the data: each review body began "Benchmark review text for ...", which makes a task that asks an agent to read a review meaningless. Titles now follow the upstream pattern (" | B&H", and the home title bhphotovideo.com serves), page copy reads like the store it mirrors, and generated reviews carry ordinary short review prose. What this site is stays disclosed, in the one place upstream keeps a utility strip: catalog facts from archived B&H pages, accounts and reviews and orders generated, no live payment or fulfilment. The same statement is in the footer, the source manifest and the seed module docstring. Pickup copy now names the single real B&H counter instead of claiming several locations. --- sites/bh_photo/app.py | 2 +- sites/bh_photo/asset_inventory.json | 80 +++++++++++++++++++ sites/bh_photo/seed_data.py | 31 +++++-- sites/bh_photo/source_catalog.json | 2 +- sites/bh_photo/templates/account.html | 2 +- sites/bh_photo/templates/account_edit.html | 2 +- sites/bh_photo/templates/addresses.html | 2 +- sites/bh_photo/templates/base.html | 10 +-- sites/bh_photo/templates/bundles.html | 4 +- sites/bh_photo/templates/cart.html | 2 +- sites/bh_photo/templates/categories.html | 4 +- .../bh_photo/templates/category_listing.html | 2 +- sites/bh_photo/templates/checkout.html | 4 +- sites/bh_photo/templates/compare.html | 2 +- sites/bh_photo/templates/contact.html | 6 +- sites/bh_photo/templates/help.html | 4 +- sites/bh_photo/templates/index.html | 2 +- sites/bh_photo/templates/login.html | 6 +- sites/bh_photo/templates/order_receipt.html | 2 +- sites/bh_photo/templates/orders.html | 2 +- sites/bh_photo/templates/product_detail.html | 6 +- sites/bh_photo/templates/register.html | 2 +- sites/bh_photo/templates/store_pickup.html | 4 +- sites/bh_photo/templates/wishlist.html | 2 +- 24 files changed, 140 insertions(+), 45 deletions(-) diff --git a/sites/bh_photo/app.py b/sites/bh_photo/app.py index 7c17ac299..40f863eb8 100644 --- a/sites/bh_photo/app.py +++ b/sites/bh_photo/app.py @@ -799,7 +799,7 @@ def inject_globals(): "cart_count": metrics["count"], "compare_count": len(current_compare_products()), "wishlist_count": len(current_user.wishlist_items) if current_user.is_authenticated else 0, - "demo_notice": "Local benchmark mirror with deterministic demo inventory, users, orders, and checkout flows.", + "demo_notice": "Offline research mirror. Catalog facts are sourced from archived B&H pages; accounts, reviews and orders are generated test data.", } diff --git a/sites/bh_photo/asset_inventory.json b/sites/bh_photo/asset_inventory.json index 2db0d0db4..7f72ea2f9 100644 --- a/sites/bh_photo/asset_inventory.json +++ b/sites/bh_photo/asset_inventory.json @@ -47,6 +47,78 @@ "product": "Apple 14\" MacBook Pro and AppleCare+ Protection Plan Kit (M3 Max, Silver)", "sha256": "75326ae1899af3fe696506b64fcc331f2f5040ebcbc2c6a5c13f2277ee264b76" }, + "apmbpm512": { + "archive_image_url": "https://web.archive.org/web/20260601221334im_/https://www.bhphotovideo.com/images/fb/apple_mbp_m5_12_14_macbook_pro_m5_1925599.jpg", + "bytes": 140408, + "file": "images/products/apmbpm512.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/apple_mbp_m5_12_14_macbook_pro_m5_1925599.jpg", + "product": "Apple 14\" MacBook Pro (M5, Space Black)", + "sha256": "f76fb22c4493327b9ef36a644958ba0abe46bb7c65e376a4ba22831c91de9b38" + }, + "apmbpm514": { + "archive_image_url": "https://web.archive.org/web/20260524023727im_/https://www.bhphotovideo.com/images/fb/apple_mbp_m5_14_14_macbook_pro_m5_1925601.jpg", + "bytes": 140408, + "file": "images/products/apmbpm514.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/apple_mbp_m5_14_14_macbook_pro_m5_1925601.jpg", + "product": "Apple 14\" MacBook Pro (M5, Nano-Texture Glass, Space Black)", + "sha256": "f76fb22c4493327b9ef36a644958ba0abe46bb7c65e376a4ba22831c91de9b38" + }, + "apmbpm515": { + "archive_image_url": "https://web.archive.org/web/20260524023727im_/https://www.bhphotovideo.com/images/fb/apple_mbp_m5_15_14_macbook_pro_m5_1925602.jpg", + "bytes": 140408, + "file": "images/products/apmbpm515.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/apple_mbp_m5_15_14_macbook_pro_m5_1925602.jpg", + "product": "Apple 14\" MacBook Pro (M5, Nano-Texture Glass, Space Black)", + "sha256": "f76fb22c4493327b9ef36a644958ba0abe46bb7c65e376a4ba22831c91de9b38" + }, + "apmbpm522": { + "archive_image_url": "https://web.archive.org/web/20260423141926im_/https://www.bhphotovideo.com/images/fb/apple_mbp_m5_22_14_macbook_pro_m5_1925609.jpg", + "bytes": 140408, + "file": "images/products/apmbpm522.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/apple_mbp_m5_22_14_macbook_pro_m5_1925609.jpg", + "product": "Apple 14\" MacBook Pro (M5, Nano-Texture Glass, Space Black)", + "sha256": "f76fb22c4493327b9ef36a644958ba0abe46bb7c65e376a4ba22831c91de9b38" + }, + "apmbpm523": { + "archive_image_url": "https://web.archive.org/web/20260708205826im_/https://www.bhphotovideo.com/images/fb/apple_mbp_m5_23_14_macbook_pro_m5_1925610.jpg", + "bytes": 140408, + "file": "images/products/apmbpm523.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/apple_mbp_m5_23_14_macbook_pro_m5_1925610.jpg", + "product": "Apple 14\" MacBook Pro (M5, Nano-Texture Glass, Space Black)", + "sha256": "f76fb22c4493327b9ef36a644958ba0abe46bb7c65e376a4ba22831c91de9b38" + }, + "apmbpm524": { + "archive_image_url": "https://web.archive.org/web/20260715030400im_/https://www.bhphotovideo.com/images/fb/apple_mbp_m5_24_14_macbook_pro_m5_1925611.jpg", + "bytes": 140408, + "file": "images/products/apmbpm524.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/apple_mbp_m5_24_14_macbook_pro_m5_1925611.jpg", + "product": "Apple 14\" MacBook Pro (M5, Nano-Texture Glass, Space Black)", + "sha256": "f76fb22c4493327b9ef36a644958ba0abe46bb7c65e376a4ba22831c91de9b38" + }, + "apmbpm544": { + "archive_image_url": "https://web.archive.org/web/20260715030400im_/https://www.bhphotovideo.com/images/fb/apple_mbp_m5_44_14_macbook_pro_m5_1925631.jpg", + "bytes": 140105, + "file": "images/products/apmbpm544.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/apple_mbp_m5_44_14_macbook_pro_m5_1925631.jpg", + "product": "Apple 14\" MacBook Pro (M5, Nano-Texture Glass, Silver)", + "sha256": "c9c997101f185134b910127bf2cde696f0019831c14d9fc6408bfe3d66fa3b0c" + }, + "apmbpm5o4": { + "archive_image_url": "https://web.archive.org/web/20260601221346im_/https://www.bhphotovideo.com/images/fb/apple_mbp_m5_o4_14_macbook_pro_m5_1925634.jpg", + "bytes": 140408, + "file": "images/products/apmbpm5o4.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/apple_mbp_m5_o4_14_macbook_pro_m5_1925634.jpg", + "product": "Apple 14\" MacBook Pro (M5, Space Black)", + "sha256": "f76fb22c4493327b9ef36a644958ba0abe46bb7c65e376a4ba22831c91de9b38" + }, + "apmde04lla": { + "archive_image_url": "https://web.archive.org/web/20260508162437im_/https://www.bhphotovideo.com/images/fb/apple_mde04ll_a_14_macbook_pro_m5_1925475.jpg", + "bytes": 118887, + "file": "images/products/apmde04lla.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/apple_mde04ll_a_14_macbook_pro_m5_1925475.jpg", + "product": "Apple 14\" MacBook Pro (M5, Space Black)", + "sha256": "eba727cbdad5ca3508a32fffb98b15d49ee683445250d4cea5fc9ac50a9a7974" + }, "apt12": { "archive_image_url": "https://web.archive.org/web/20260730151928im_/https://www.bhphotovideo.com/images/fb/api_audio_t12_2_channel_tube_mic_preamp_1904715.jpg", "bytes": 99136, @@ -703,6 +775,14 @@ "product": "TELEVIC Mike PLM401F 16\" Single Flex Gooseneck Microphone", "sha256": "e417a7bb01c47c2df8e63932cdfe5af02c594ec454eaa37a4d4f97d51de443f0" }, + "templm502f50": { + "archive_image_url": "https://web.archive.org/web/20260603124207im_/https://www.bhphotovideo.com/images/fb/televic_71_98_0095_mike_gooseneck_mic_plm502f_1925085.jpg", + "bytes": 75348, + "file": "images/products/templm502f50.jpg", + "original_image_url": "https://www.bhphotovideo.com/images/fb/televic_71_98_0095_mike_gooseneck_mic_plm502f_1925085.jpg", + "product": "TELEVIC Mike PLM502F 20\" Dual Flex Gooseneck Microphone", + "sha256": "313c7f47003471e0840517c76ad979894ac0cd200f77e0eebd0e16e518fa6619" + }, "tokpc3012mft": { "archive_image_url": "https://web.archive.org/web/20260227070013im_/https://www.bhphotovideo.com/images/fb/tokina_kpc_3012mft_180mm_t1_9_vista_lens_1702392.jpg", "bytes": 394913, diff --git a/sites/bh_photo/seed_data.py b/sites/bh_photo/seed_data.py index a48cc4e6a..66c31f2c6 100644 --- a/sites/bh_photo/seed_data.py +++ b/sites/bh_photo/seed_data.py @@ -46,7 +46,7 @@ "address": "420 9th Ave, New York, NY 10001", "pickup_hours": "Mon-Thu 9:30am-7pm, Fri 9:30am-1pm, Sun 10am-6pm", "contact_phone": "800-606-6969", - "inventory_note": "Pickup counts in this mirror are benchmark state, not live inventory.", + "inventory_note": "Counter stock shown on this mirror is test data, not live inventory.", } USER_DEFS = [ @@ -66,6 +66,20 @@ "Solid build, predictable results", "Worth the upgrade", "Good value for the feature set", "Does one job and does it well", ] +REVIEW_BODIES = [ + "Picked this up after comparing the spec sheets and it has matched them so far. " + "Build quality is what I expected at this price.", + "Used it on back-to-back jobs last month with no surprises. Setup was quick and " + "it behaved the same way every time.", + "Does what the listing says. Nothing flashy, but it has not let me down and the " + "handling is comfortable over a long day.", + "Upgraded from an older unit. The improvement is noticeable in daily use, " + "though the older one still works fine for lighter work.", + "Good fit for my workflow. Read the specification table before ordering and " + "check the ports match what you already own.", + "Solid for the money. It is not the top of the range, but for regular use it " + "covers everything I needed.", +] QUESTION_TEMPLATES = [ "Is this covered by the standard return window?", "Does this ship with the manufacturer warranty?", @@ -320,8 +334,7 @@ def seed_database(db, models, base_dir: str): product_id=product.id, author_name=pick(REVIEW_AUTHORS, "author", seed_key, number), headline=pick(REVIEW_HEADLINES, "headline", seed_key, number), - body=(f"Benchmark review text for {product.name}. This mirror generates " - f"review copy; it is not taken from B&H."), + body=pick(REVIEW_BODIES, "body", seed_key, number), rating=rating, verified_purchase=digest("verified", seed_key, number) % 3 != 0, created_at=MIRROR_REFERENCE_DATE - timedelta(days=30 + number * 17), )) @@ -376,14 +389,16 @@ def seed_database(db, models, base_dir: str): total = sum(item.price for item in chosen) if total <= 0: continue - title = f"{chosen[0].name.split()[0]} {department.replace('-', ' ').title()} Kit {number + 1}" + lead_brand = chosen[0].name.split()[0] + shelf_label = department.replace("-", " ").title() + title = f"{lead_brand} {shelf_label} Kit {number + 1}" bundle = Bundle( title=title, slug=slugify(title), - description=("Benchmark bundle: these items are grouped by this mirror for " - "multi-item checkout tasks. B&H does not sell this combination."), + description=("A package of compatible items sold together at a kit price. " + "Each item in the kit is listed below."), image_path=chosen[0].image_path, bundle_price=round(total * 0.93, 2), list_price=round(total, 2), - badge="Benchmark bundle", audience=department.replace("-", " ").title(), + badge="Kit price", audience=department.replace("-", " ").title(), featured=number == 0, ) db.session.add(bundle) @@ -483,7 +498,7 @@ def seed_benchmark_users(db, models): status=status, subtotal=subtotal, shipping=0.0, tax=round(subtotal * 0.08875, 2), total=round(subtotal * 1.08875, 2), fulfillment=fulfillment, payment_label="Demo Visa ending in 4242", - note="Benchmark order created by the mirror seed.", created_at=placed, + note="", created_at=placed, ) db.session.add(order) db.session.flush() diff --git a/sites/bh_photo/source_catalog.json b/sites/bh_photo/source_catalog.json index fb27fcf3a..0f1527e86 100644 --- a/sites/bh_photo/source_catalog.json +++ b/sites/bh_photo/source_catalog.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-09-12T17:27:31Z", + "generated_at": "2026-09-12T17:28:49Z", "upstream": "https://www.bhphotovideo.com/", "method": "Catalog facts read from dated Internet Archive captures of bhphotovideo.com; the live site answers automated requests with a bot challenge. Each product record carries the capture URL and timestamp it was read from. Fields the source does not state are null. Accounts, reviews, questions, bundles, store locations, carts and orders are NOT sourced - they are declared benchmark-synthetic state generated by seed_data.py.", "departments": { diff --git a/sites/bh_photo/templates/account.html b/sites/bh_photo/templates/account.html index 7ea000307..4abe8c012 100644 --- a/sites/bh_photo/templates/account.html +++ b/sites/bh_photo/templates/account.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% block title %}Account · B&H Demo Mirror{% endblock %} +{% block title %}Account | B&H{% endblock %} {% block content %}

My account

diff --git a/sites/bh_photo/templates/account_edit.html b/sites/bh_photo/templates/account_edit.html index 6abcd898d..952f49c2c 100644 --- a/sites/bh_photo/templates/account_edit.html +++ b/sites/bh_photo/templates/account_edit.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% block title %}Edit Account · B&H Demo Mirror{% endblock %} +{% block title %}Edit Account | B&H{% endblock %} {% block content %}
diff --git a/sites/bh_photo/templates/addresses.html b/sites/bh_photo/templates/addresses.html index f563414e2..560ab8411 100644 --- a/sites/bh_photo/templates/addresses.html +++ b/sites/bh_photo/templates/addresses.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% block title %}Addresses · B&H Demo Mirror{% endblock %} +{% block title %}Addresses | B&H{% endblock %} {% block content %}

Saved addresses

diff --git a/sites/bh_photo/templates/base.html b/sites/bh_photo/templates/base.html index c9ba93dc8..92ec02ef8 100644 --- a/sites/bh_photo/templates/base.html +++ b/sites/bh_photo/templates/base.html @@ -3,14 +3,14 @@ - {% block title %}B&H Photo Demo Mirror{% endblock %} + {% block title %}B&H Photo Video Digital Cameras, Photography, Computers{% endblock %}
- Demo mirror only: all checkout, reservations, inventory, and orders use deterministic local benchmark data. + Offline research mirror of bhphotovideo.com. Catalog facts come from archived B&H pages; accounts, reviews, orders and inventory are generated test data. No live payment or fulfilment. No live payment
@@ -19,8 +19,8 @@ B&HPHOTO·VIDEO·AUDIO - Photo - Demo Mirror + Photo Video + Pro Audio @@ -73,7 +73,7 @@