---
title: Bulk Video Management
slug: /features/bulk-video-management
module: productvideo
since: 3.2.5
sidebar_position: 10
---

# Bulk Video Management

Assign, update, or remove videos across hundreds of products at once using a filtered, preview-first workflow — no CSV required.

## Overview

Bulk Video Management lets you perform three operations on any filtered set of products: **Add** a video to all matching products, **Update** properties of existing videos (title, position, visibility), or **Remove** videos from matching products. All three operations run in the browser using chunked AJAX requests, so large catalogs do not time out.

Before any change is written, you preview the exact list of products that will be affected. You can then select all matching products, pick individual ones from the list, or increase the preview limit to check more products. Operations report progress in real time with a percentage bar, ETA, and products-per-cycle indicator.

Settings you use regularly can be saved as named presets and reloaded in one click. If a browser tab is closed mid-operation, an automatic recovery prompt appears the next time you open the page.

## Navigation

Go to **Catalog > Videos: Bulk Update** in the Back Office sidebar.

> On PrestaShop 1.6, the tab appears under **Catalog** in the top navigation. On PrestaShop 1.7 and later, it appears in the **Sell** section of the sidebar.

## Workflow

The standard workflow is always the same, regardless of which action you choose:

1. **Set filters** — narrow down which products to target.
2. **Choose an action** and fill in the video fields for that action.
3. Click **Preview Affected Products** — a product table loads below the form.
4. Review the list; select individual products or use **Select all matching** to target the full filtered set.
5. Click **Execute Bulk Operation** and confirm the modal.
6. Watch the progress bar. When it reaches 100%, a success summary appears.

---

## Product Filters

Filters are applied before the preview loads. You can combine any number of filters.

| Filter | Options | Behavior |
|--------|---------|----------|
| **Category** | All Categories / Select Specific | "All Categories" requires at least one other filter to be set (a confirmation dialog is shown if not). "Select Specific" allows multi-select of categories. |
| **Manufacturer** | All / specific brand | Limits to products from the selected manufacturer. |
| **Product Status** | All / Active only / Inactive only | Filters by the product's enabled/disabled state. |
| **Has Videos** | All / Yes / No | "Yes" targets products that already have at least one video. "No" targets products with no videos at all — useful for adding videos to products that don't have any yet. |
| **Language** | All languages / specific language | Visible only when the store has more than one active language. Controls which language records are written or modified. |
| **Shop** | All shops / specific shop | Visible only in multi-shop configurations. Controls which shop records are written or modified. |

> When **Category** is set to "All Categories" with no other filter active, a warning dialog asks you to confirm before running the preview. This prevents accidentally targeting the entire catalog.

---

## Actions

### Add — Assign a video to products

Adds a new video entry to every product in the filtered set.

| Field | Required | Description |
|-------|----------|-------------|
| **Video URL** | Yes | YouTube, Vimeo, HTML5 (.mp4/.webm/.ogg), or iframe embed code. The URL is validated in real time and a preview renders below the field. |
| **Video Title** | No | Text displayed with the video. If left empty, the product name is used as the default title. |
| **Position** | No | Where to insert the video in the product's video list. Options: First, Last (default), or a specific numeric position. |
| **Registered customers only** | No | When enabled, the video is hidden from guests; only logged-in customers can see it. |
| **If video already exists** | — | **Ignore** (default): skip products that already have this exact video URL. **Update**: overwrite the existing video's title, position, and visibility settings. |

### Update — Modify existing videos

Changes properties on videos that already exist for the filtered products. At least one field must be filled.

| Field | Description |
|-------|-------------|
| **Video URL (exact match)** | Optional. When provided, only videos with this exact URL are modified. Leave empty to update all videos on each matching product. |
| **Video Title** | New title. Leave empty to leave existing titles unchanged. |
| **Position** | Move the matched video to a new position. Other videos shift accordingly. |
| **Registered customers only** | Toggle visibility. |

### Remove — Delete videos from products

Deletes video records from the filtered product set.

| Field | Description |
|-------|-------------|
| **Video URL (exact match)** | Optional. When provided, only the video with this exact URL is deleted. Leave empty to remove **all** videos from each matching product. |

> Remove operations are permanent and cannot be undone. A warning banner appears when this action is selected, and an additional confirmation modal is shown before execution.

---

## Preview Panel

After clicking **Preview Affected Products**, a table loads showing up to 100 matching products by default (ID, reference, cover image, name). Use the **Show** dropdown to increase the visible count to 250, 500, 1,000, or All.

When more products match the filters than are currently displayed, a yellow banner appears: **"Select all X matching products."** Clicking that link and confirming switches to "all matching" mode — the operation will process every product that matches the filters, not just those shown in the table.

You can also select individual products using their checkboxes, or use **Select visible** / **Deselect** to bulk-check the current page. Clicking a product thumbnail enlarges the image.

The **Execute Bulk Operation** button appears both above and below the product table once at least one product is selected (or all-matching mode is active).

---

## Execution and Progress

The operation runs as a series of AJAX requests, each processing a chunk of products. The progress overlay shows:

- A percentage bar filling in real time.
- A details line: `processed / total products — ~X seconds remaining (N products per cycle)`.

**Adaptive chunk sizing:** The chunk size starts at 100 products per request. After each successful chunk, it grows by 5% so faster servers process more per round trip. If a request times out or fails, the chunk size is reduced by 10% and the failed chunk is retried automatically at the smaller size. The optimal size is persisted per shop so subsequent operations start from the last known good value.

When execution completes, the overlay closes and a success message shows a breakdown: how many videos were added, updated, skipped, or failed.

If **Keep settings after execution** is checked, the form remains filled so you can immediately run the same operation again. Otherwise the form resets.

---

## Saved Presets

Any combination of filters and action settings can be saved as a named preset for reuse.

**To save a preset:**
- Check **Save as preset before executing** in the form footer before clicking Execute. A modal appears asking for a name. If you loaded an existing preset, you can update it in place or save as a new one.
- Alternatively, the preset save modal can be triggered from the execution confirmation flow.

**To load a preset:**
- Click **Load Saved Configuration** above the form. A panel lists all saved presets for the current shop, sorted by most recently used, with the creator's name and a short summary. Click **Load** to populate the form with those settings.

**Ownership:** Any admin employee can view and load all presets saved for the shop. Only the employee who created a preset can edit or delete it.

---

## Auto-Recovery

Immediately before execution starts, the current settings are saved silently as a special `__auto_recovery__` preset. If the browser is closed or the page is navigated away mid-operation, the next time any employee opens Bulk Video Management they will see a yellow **Incomplete operation detected** banner showing the timestamp of the interrupted run.

- Click **Load & Retry** to restore the settings and re-run. Because the "skip duplicates" mode is the default for Add operations, products already processed in the previous run are skipped automatically.
- Click **Dismiss** to discard the recovery preset and clear the banner.

The recovery preset is deleted automatically when an operation completes successfully.

---

## Usage Examples

**Example: Add a brand video to all active products in a category**

Set **Category** to "Select Specific" and choose "Outdoor Gear". Set **Product Status** to "Active only". Set **Has Videos** to "No" to target only products without a video. Enter the YouTube URL in **Video URL** and set **Position** to "First". Preview, confirm all 47 matching products look correct, then execute. The video is added to all 47 products; any that already had this video are skipped.

**Example: Remove a discontinued video from all products**

Select the **Remove** action. Leave **Category** as "All Categories" and set no other filters — the confirmation dialog will appear. Enter the exact video URL in **Video URL (exact match)** so only that specific video is removed (not all videos). Preview and verify the count, then execute. Position numbers for remaining videos are automatically reordered after deletion.

**Example: Reuse a configuration for weekly catalog updates**

After configuring filters and video settings for a regular import workflow, check **Save as preset before executing** and name it "Weekly New Arrivals". On subsequent weeks, click **Load Saved Configuration**, load the preset, update the Video URL field to the new video, and execute. One reload instead of filling the full form each time.

---

## Important Notes

- **Video provider must be registered.** If a URL uses a provider not in the allowed list (Catalog > Video Providers), the video URL field shows a validation error and previewing is blocked. A link to the provider configuration page appears in the error message.
- **Iframe embed codes are accepted.** The URL is automatically extracted from the `src` attribute of a pasted `<iframe>` tag before it is stored.
- **Position numbers are relative per product.** Setting position to "3" on a product that only has 2 videos inserts at position 3 (last). The position is clamped to the actual video count.
- **Language and shop scope.** Setting Language to "All languages" writes a separate video record for each language. Same for "All shops" in multi-shop mode. A single bulk Add on a 3-language, 2-shop store creates up to 6 database rows per product.
- **Chunk size is global per shop**, not per employee. If one employee's operation establishes an optimal chunk size, all subsequent operations on that shop benefit from it.
- **Presets are shop-scoped.** Presets saved on one shop are not visible when operating from a different shop context.

---

## Troubleshooting

| Problem | Solution |
|---------|----------|
| "No products match the specified filters" | Verify the filter combination. Using "Has Videos: No" together with a specific video URL filter produces zero results by design — these two filters are mutually exclusive. |
| Video URL field shows "Provider Not Allowed" | The video's domain is not in the allowed provider list. Go to **Catalog > Video Providers** and add the provider, then return and re-enter the URL. |
| Operation times out or stalls on large catalogs | The chunk size auto-reduces on timeout and retries. If it keeps failing, check the server's PHP `max_execution_time` and `memory_limit` settings. The minimum chunk size is 25 products. |
| Progress bar reaches 100% but "failed" count is high | Usually means some products have a database constraint (e.g., the unique index on `id_product + id_video + id_lang + id_shop`). If "Skip duplicates" is active, those are counted as "skipped" not "failed". "Failed" indicates a database write error — check PS error logs. |
| Recovery banner appears every time the page loads | A previous operation did not complete. Either load and retry, or dismiss to clear the recovery preset. If the banner keeps returning, check that the AJAX delete call is not blocked by a firewall or plugin. |
| Preset loaded but video URL field is empty | The preset was saved during an Update or Remove operation, which uses a filter URL rather than an Add URL. This is expected — fill in the new target URL before executing. |

---

## Technical Reference

- **Admin controller**: `controllers/admin/AdminProductVideoMassController.php` — handles all AJAX endpoints and form rendering
- **JavaScript**: `views/js/admin/product_video_mass.js` — chunked execution engine, preset UI, progress bar, video URL validation
- **Template**: `views/templates/admin/controller/product_video_mass.tpl` — form fields, preview panel, modals, recovery banner
- **Hooks used**: `actionAdminControllerSetMedia` — loads CSS/JS assets for this controller
- **Configuration keys**:
  - `PV_MASS_CHUNK_SIZE` — last known optimal chunk size (int, default 100, range 25–2000)
  - `PV_MASS_CHUNK_LOCKED` — whether the chunk size has been capped due to a timeout (bool)
- **Database table**: `product_videos_bulk_presets` — stores named presets and the auto-recovery preset; scoped by `id_employee` and `id_shop`
- **AJAX actions**: `previewProducts`, `getMatchingIds`, `executeBulk`, `savePreset`, `loadPresets`, `loadPreset`, `updatePreset`, `deletePreset`, `deleteAutoRecoveryPreset`, `saveChunkConfig`, `validateVideoUrl`
- **Chunk growth rate**: 5% per successful chunk (`GROWTH_RATE = 1.05`). Stops growing when time-per-product exceeds 150% of the first-chunk baseline (`TPP_CEILING = 1.5`). Shrinks by 10% on timeout (`TIMEOUT_SHRINK = 0.90`).

## Related Features

- [Video Import / Export](./video-import-export.md) — CSV-based bulk import for adding videos with more per-video control (title, language, position per row)
