=== Minute Video ===

Contributors: minutemedia
Tags: video, voltax, minute, sendtonews, stnvideo
Stable tag: 2.0.3
Requires at least: 5.0.3
Tested up to: 7.1
Requires PHP: 7.2
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html

Embed Minute Platform OVP videos and playlists in WordPress, with full sendtonews shortcode and oEmbed support.

== Description ==

The Minute Video plugin connects WordPress to [Minute's Online Video Platform (OVP)](https://www.minutegroup.com/). Use it to embed OVP videos and playlists in posts, sidebars, and theme templates, set featured video, and serve sendtonews embeds already in your content.

[Download the user guide (PDF)](https://plugins.trac.wordpress.org/browser/voltax-video-player/tags/2.0.3/assets/pdf/guide.pdf?format=raw)

= What you can do =

* Configure OVP credentials under **Settings > Minute Video**
* Search and insert videos from the **Video Library** in the post editor (classic editor or Minute Video block)
* Insert playlists or shortcodes from the embed modal in widgets and the customizer
* Embed with the `[voltax]` shortcode (or legacy `[mm-video]` where already in use)
* Embed sendtonews content with the `[sendtonews]` shortcode or `embed.sendtonews.com` oEmbed URLs
* Set a featured video per post and render it with the `MinuteMedia\Ovp\Player` theme API
* Paste Minute Video URLs for oEmbed on `*.minutemediaservices.com`
* Serve AMP pages with Minute Platform and sendtonews `amp-video-iframe` output (legacy `[mm-video]` uses `amp-minute-media-player`)

= Account =

A Minute Platform OVP account is required for new Minute Video embeds. Contact [sales@minutegroup.com](mailto:sales@minutegroup.com) for access.

== Installation ==

1. Install or update through the **Plugins** menu in WordPress.
2. Open **Settings > Minute Video** and enter the OVP credentials from Minute.
3. If your site uses sendtonews embeds, confirm the legacy Company ID and authentication code on **Settings > Minute Video** (shown when present).
4. Embed from the editor, widget, or shortcodes (see FAQ).
5. Optional — Featured video: select a video in the post metabox, or use `MinuteMedia\Ovp\Player::create()` in your theme.

== Frequently Asked Questions ==

= Do I need a paid account? =

Yes. New Minute Video embeds require a Minute Platform OVP account. Sendtonews embeds use the Company ID and keys stored in your WordPress settings.

= Where is the Video Library available? =

The **Video Library** tab appears in the embed modal on the **post editor** only (classic editor and block editor when editing posts). It is not available in the widget screen, customizer, or site editor. On those screens, use the **Playlists** tab or paste a shortcode in the **ShortCode** tab.

= How do I embed a video or playlist? =

On the **post editor**, open the embed modal from **Add Video** / **Add Playlist** (classic editor) or the **Minute Video** block, search the **Video Library**, and insert. The plugin adds a `[voltax]` shortcode for you.

In the **widget** or **customizer**, open the embed modal and use the **Playlists** tab, or paste a shortcode in the **ShortCode** tab.

You can also paste a shortcode directly anywhere:

`[voltax id="CONTENT_ID"]`

Optional: `playbackmethod` (`autoplay` or `clicktoplay`). When omitted, the player uses its own default. Organization and property are taken from **Settings > Minute Video**.

= How do I attach a playlist? =

Pick a playlist from the **Playlists** tab in the embed modal, or pass the playlist content ID in `[voltax id="PLAYLIST_ID"]`. New `[voltax]` embeds only need the content ID.

= I have existing `[mm-video]` shortcodes. Do they still work? =

Yes. Legacy `[mm-video]` shortcodes continue to render. New embeds should use the Video Library and `[voltax]`:

`[mm-video id="CONTENT_ID" type="video"]`

`[mm-video id="CONTENT_ID" type="playlist" playlist="PLAYLIST_ID"]`

Optional legacy attributes: `player`, `playlist_id`, `player_id`, and `image` (preview thumbnail). A **Default Player ID** for legacy embeds appears under **Legacy Minute Platform Settings** on the settings page when one is already configured.

= How do I embed sendtonews content? =

Use the `[sendtonews]` shortcode or paste an `embed.sendtonews.com` oEmbed URL. Supported types: `single`, `float`, `player`, `full`, `barker`, `amp`, and `amplist`.

`[sendtonews key="YOUR_KEY" type="player" cid="OPTIONAL_CID"]`

= Does the plugin support AMP? =

Yes. New `[voltax]` embeds and sendtonews content render as `amp-video-iframe` on AMP pages. Legacy `[mm-video]` shortcodes that use the player.js embed path render as `amp-minute-media-player`.

= I have two video plugins active. Which should I keep? =

Keep **Minute Video** (this plugin) and deactivate any legacy Minute video plugin shown in the admin notice.

= How do featured videos work? =

Pick a video in the **Featured Video Player** metabox on the post edit screen, or integrate the theme API. `MinuteMedia\Ovp\Player::create()` renders the player; the featured image area can also show the embed when configured. Hide the metabox via **Screen Options**, or limit which post types show it with the `voltax_featured_video_screens` filter. Sites still using the legacy `stnvideo_featured_video_screens` hook continue to work unless `voltax_featured_video_screens` is also in use.

= Can I disable automatic AMP embed switching? =

Yes. In `wp-config.php`, define `DISABLE_VOLTAX_AMP_SWITCH` as `true` before the plugin loads. This affects `[voltax]` and `[sendtonews]` embeds only. The legacy constant `DISABLE_S2N_AMP_SWITCH` is also honored. Legacy `[mm-video]` embeds always follow AMP detection.

= How do I use a branded or no-ads property for one embed? =

Add optional attributes on `[voltax]`. They override **Settings → Minute Video** for that embed only:

`[voltax id="CONTENT_ID" property="BRANDED_PROPERTY"]`

`[voltax id="CONTENT_ID" organization="ORG_ID" property="BRANDED_PROPERTY"]`

To show an **Override Property** field on Featured Video, the Minute Video block, and the Minute Video widget (single videos), define `VOLTAX_ENABLE_OVERRIDE_PROPERTY` as `true` in `wp-config.php` before the plugin loads. Organization override is shortcode-only.

= I am upgrading from the STN Video Player Selector plugin. What still works? =

Existing STN and Minute Platform content continues to render without re-embedding:

* `[sendtonews]` shortcodes and `embed.sendtonews.com` oEmbed URLs
* Legacy `[mm-video]` shortcodes
* Legacy **STN Video** block (`sendtonews/playerselector`) — loads in the editor; use **Replace with Minute Video** to upgrade to the `voltax/video` block
* Legacy **STN Video** widget (`sendtonews`) — keeps rendering Smart Match and other STN players in sidebars/templates; use **Replace with Minute Video** to upgrade that widget instance
* Legacy featured video meta from STN or Minute Video
* New embeds use **Minute Video** block (`voltax/video`) and **Minute Video** widget (`voltax_video`)

Deactivate the old STN or Minute Video plugins when prompted by the admin notice. OVP credentials under **Settings > Minute Video** are required for new Minute Video picker UI; legacy sendtonews embeds only need Company ID settings when already configured.

= What embed types does the plugin render? =

| Embed | Standard (non-AMP) | AMP |
|-------|-------------------|-----|
| `[voltax]` | Minute Video script from `players.voltaxservices.io` | `amp-video-iframe` → `mp.mmvideocdn.com/mini-player/amp/` |
| `[mm-video]` (legacy) | `vms-players.minutemediaservices.com/{playerId}.js` | `amp-minute-media-player` (legacy sanitizer path) |
| `[sendtonews]` `float`, `single`* | `embed.sendtonews.com/player3/embedcode.js` | `amp-video-iframe` → `amp.stnvideo.com/avi/` |
| `[sendtonews]` `player` | `embed.sendtonews.com/player3/embedcode.js` | `amp-video-iframe` → `amp.stnvideo.com/avi/` |
| `[sendtonews]` `full`, `barker` | `embed.sendtonews.com/player2/embedcode.php` | `amp-video-iframe` → `amp.stnvideo.com/avi/` |
| `[sendtonews]` `amp`, `amplist` | n/a (AMP-only types) | `amp.stnvideo.com/avi/` |

*`single` is treated as `float` for legacy compatibility.

oEmbed: `embed.sendtonews.com` (STN) and `*.minutemediaservices.com` (Voltax).

= Will minify plugins break embeds? =

If you use JavaScript minification or combination plugins, exclude third-party player scripts from minify/combine/defer handling. Minute Video player and legacy STN player scripts are loaded asynchronously by design; minifying them often breaks playback.

**Minute Video (`[voltax]`, Voltax block/widget)**

* `players.voltaxservices.io/players/`

**Legacy Minute Platform (`[mm-video]`)**

* `vms-players.minutemediaservices.com/` (and other `*.minutemediaservices.com` player script hosts in use on your site)

**sendtonews / STN (`[sendtonews]`, legacy STN block/widget, oEmbed)**

* `embed.sendtonews.com/player1/responsive.js`
* `embed.sendtonews.com/player2/embedcode.php`
* `embed.sendtonews.com/player3/embedcode.js`
* `embed.sendtonews.com/player4/embedcode.js`
* `embed.stnvideo.com/player1/responsive.js`
* `embed.stnvideo.com/player2/embedcode.php`
* `embed.stnvideo.com/player3/embedcode.js`
* `embed.stnvideo.com/player4/embedcode.js`

Some older embeds or oEmbed responses may still reference `embed.stnvideo.com` mirror URLs even when the plugin outputs `embed.sendtonews.com`. Exclude both hostnames if minify issues persist.

AMP embeds use `amp-video-iframe` (`mp.mmvideocdn.com`, `amp.stnvideo.com`) or `amp-minute-media-player` for legacy `[mm-video]`; these are not JavaScript files and do not need minify exclusions.

= Where can I get help? =

Contact your Minute account team or [sales@minutegroup.com](mailto:sales@minutegroup.com).

== Developer reference ==

= wp-config constants =

* `VOLTAX_DEBUG` — Enable admin/modal debug logging. Default false.
* `DISABLE_VOLTAX_AMP_SWITCH` — When true, disables automatic AMP switching for `[voltax]` and `[sendtonews]` embeds.
* `DISABLE_S2N_AMP_SWITCH` — Legacy STN constant; same behavior as `DISABLE_VOLTAX_AMP_SWITCH`.
* `VOLTAX_ENABLE_OVERRIDE_PROPERTY` — When true, shows **Override Property** on Featured Video, the Voltax block, and the Voltax widget for single-video selections. `[voltax]` `property` and `organization` attributes always work without this constant.

= Filters =

Featured Video metabox post types (default: post, page). Use `voltax_featured_video_screens` for new integrations. `stnvideo_featured_video_screens` is a legacy fallback used only when the voltax filter has no callbacks.

* `voltax_featured_video_screens` — `( $screens )`
* `stnvideo_featured_video_screens` — legacy fallback; `( $screens )`

Embed playback and extension hooks:

* `voltax_embed_playbackmethod` — `( $playbackmethod, $content_id, $record, $options )` — `autoplay`, `clicktoplay`, or empty (omit override)
* `voltax_amp_iframe_query_args` — `( $args, $content_id )` — AMP iframe query args
* `voltax_oembed_request_params` — `( $params, $parsed, $url, $args )` — oEmbed request params
* `voltax_oembed_parsed_url` — `( $result, $query_params, $url )` — parsed source URL fields

Voltax oEmbed also forwards allowlisted optional query params from the pasted URL (for example `playbackmethod`) when present; use the filters above to inject or override.

Extra HTML attributes on player embed divs (standard/non-AMP only). Return a space-separated attribute string.

* `voltax_extra_player_div_attributes` — `( $attributes, $content_id, $post )` for `[voltax]`
* `stnvideo_extra_player_div_attributes` — `( $attributes, $player_type, $key, $cid, $post )` for `[sendtonews]`; `$player_type` is always `single`

Legacy `[mm-video]` AMP. Use `voltax_video_amp_attributes` for new integrations. `mm_video_amp_attributes` is a legacy fallback used only when the voltax filter has no callbacks.

* `voltax_video_amp_attributes` — `( $attributes, $node )`
* `mm_video_amp_attributes` — legacy fallback; `( $attributes )` only
* `voltax_amp_force_sanitizer_placeholder` — `( $default, $record, $options )`
* `voltax_amp_use_sanitizer_path` — `( $default, $record, $options )`

oEmbed:

* `voltax_oembed_base` — `( $default )` Voltax oEmbed service base URL (`/oembed/player`)

= Embeds and third-party scripts =

The plugin outputs shortcodes, player `<script>` tags, or AMP iframes. It does not bundle third-party player JavaScript.

**Voltax OVP (`[voltax]`)** — player div + script:

* Script: `https://players.voltaxservices.io/players/{organizationId}/{propertyId}/embed`
* AMP iframe: `https://mp.mmvideocdn.com/mini-player/amp/index.html`

**Legacy Voltax (`[mm-video]`)** — img placeholder swapped to script on the front end, or direct script embed:

* Script: `https://vms-players.minutemediaservices.com/{playerId}.js` (override with `VOLTAX_EMBED_LEGACY_ENDPOINT`)
* Front-end swap: plugin script `public/js/voltax-video-player-public.js`
* AMP: `amp-minute-media-player` via AMP sanitizer templates

**sendtonews / STN (`[sendtonews]`)** — player div + script (or AMP iframe):

* `float` / `single`: `//embed.sendtonews.com/player3/embedcode.js`
* `player` (Smart Match float): `//embed.sendtonews.com/player3/embedcode.js`
* `full` / `barker`: `//embed.sendtonews.com/player2/embedcode.php`
* `amp` / `amplist`: `https://amp.stnvideo.com/avi/`

**oEmbed providers**

* STN: `https://embed.sendtonews.com/services/oembed`
* Voltax: `*.minutemediaservices.com` URLs resolved through `/oembed/player` (`voltax_oembed_base`, default `https://videos-content.minutemediaservices.com`). Editor uses `preview_html`; front-end uses `html`.

**Legacy editor blocks and widgets**

* Block `sendtonews/playerselector` — preserved for existing posts; saved content remains `[sendtonews ...]` until replaced with `voltax/video`
* Widget `sendtonews` — preserved for existing sidebar/customizer instances; renders STN until replaced with Voltax fields on the same widget
* New block: `voltax/video`; new widget: `voltax_video`

== Screenshots ==

1. Minute Video settings — OVP credentials.
2. Classic editor **Add Video** and **Add Playlist** buttons.
3. Embed modal — Video Library tab.
4. Embed modal — Playlists tab.
5. Featured Video metabox on the post edit screen.
6. Minute Video block in the block editor.

== Changelog ==

= 2.0.3 =
* Added a link to the PDF user guide in the readme.

= 2.0.2 =
* Updated the WordPress.org contributor name and tags.
* Fixed npm audit issues.

= 2.0.1 =
* First WordPress.org release of the 2.0 rewrite.
* Bug fixes and general improvements.
* Rebranded the plugin as Minute Video.

= 2.0.0 =
* Major rewrite: Voltax OVP embeds plus full sendtonews / STN compatibility. Existing shortcodes, oEmbed, blocks, widgets, and featured-video meta keep working; new embeds use the Voltax stack.
* Security: sanitize and escape shortcode/widget embed IDs and keys (addresses CVE-2025-6539 stored XSS via `id` in 1.6.5 and earlier).
* New `[voltax]` shortcode, Gutenberg block (`voltax/video`), sidebar widget (`voltax_video`), Featured Video metabox, and React Video Library / Playlists embed modal (playlist type filter). Video Library includes **My Uploads** (organization-scoped available videos).
* Optional `[voltax]` `property` and `organization` attributes to override Settings org/property on a single embed. Optional `VOLTAX_ENABLE_OVERRIDE_PROPERTY` shows an Override Property field on Featured Video, the Voltax block, and the widget (single videos).
* Optional `[voltax]` `playbackmethod` (`autoplay` / `clicktoplay`; omitted when unset) and `voltax_embed_playbackmethod` filter; generic AMP/oEmbed/div extension filters for additional player params.
* Theme API (`MinuteMedia\Ovp\Player` and related classes), Voltax oEmbed, and AMP `amp-video-iframe` embeds for Minute Video players.
* Unified **Settings → Minute Video** (OVP credentials) with import of legacy Voltax and sendtonews Company ID settings. Settings save always retries OAuth even when other fields are unchanged.
* Legacy `[mm-video]` and `[sendtonews]` shortcodes, STN oEmbed, legacy STN block/widget (with Replace with Minute Video), and legacy featured-video meta preserved.
* Admin notices when a legacy video plugin remains active; optional Shortcake UI for classic-editor shortcodes; bundled PDF user guide.
* WordPress.org listing icons and banners updated for Minute branding.

= 1.6.5 =
* Prior WordPress.org release. See SVN tag history for earlier changes.

== Upgrade Notice ==

= 2.0.3 =
Adds a link to the PDF user guide in the readme. No functional changes.

= 2.0.2 =
Metadata update (contributor and tags) and npm audit fixes. No functional changes.

= 2.0.1 =
First WordPress.org release of the 2.0 rewrite. See the 2.0.0 notice below for what to check after updating.

= 2.0.0 =
Major rewrite with a security fix for CVE-2025-6539. Update, confirm **Settings → Minute Video**, verify front-end embeds, and deactivate any legacy video plugin shown in the admin notice. Existing sendtonews and `[mm-video]` content should continue to render without re-embedding.
