# Cuepoints plugin With the Cuepoints plugin, you can insert cues programmatically into your Wowza Flowplayer media. Cues provide start and end points relative to the video content, and use the browser's VTTCue engine to augment and enrich the playback experience. For example, you can use this plugin to inject timing data into a video with the purpose of a product placement or other key engagement moment. To see the Cuepoints plugin in action, you can view this demo. ## Before you start Before you use this plugin with the standalone player, we recommend the following steps: * Read about [embedding the core player](/docs/wowza-flowplayer/player/embed/embed-with-standalone/) in your site by adding the minimum CSS and JavaScript player components. * Make sure you have a player token. For more, see [Token configuration](/docs/wowza-flowplayer/player/configure/#token-configuration). Tokens aren't needed for local development. * The instructions on this page generally assume you're using the Wowza Flowplayer CDN to embed the player in your site. If you're using npm, see our [npm instructions](/docs/wowza-flowplayer/player/embed/embed-with-standalone/#use-npm) or our [TypeScript guide](/docs/wowza-flowplayer/guides/add-the-player-using-typescript/). ## Install the plugin To install the Cuepoints plugin, load it next to the core player: ```html ``` ```js // Import player library and basic CSS for player import flowplayer from "@flowplayer/player"; import "@flowplayer/player/flowplayer.css"; // Import plugin import Cuepoints from "@flowplayer/player/plugins/cuepoints"; ``` ## Add HTML elements embed ## Configure the plugin The plugin can be set up at the top-level configuration under the `cuepoints` namespace. The `cuepoints` array accepts a collection of objects that must contain at least `startTime` and `endTime` properties. Each property represents a start and end time, in seconds, where you may want to insert a dynamic interaction. | Property | Description | | --- | --- | | `cuepoints` *array* | Array of objects that determines when cue points are inserted into the player. These properties are used inside the array: `startTime`: Numeric value in seconds (or fractions) to add the cuepoint.`endTime`: Numeric value in seconds (or fractions) to remove the cuepoint.`text`: Message to be triggered by the cuepoint. | | `draw_cuepoints` *boolean* | Determines if cuepoints should display in the timeline and could help with debugging. By default, the cuepoints are transparent and without any styling. You can style cues with the `fp-cuepoint` class. | info The `end` and `start` properties were changed to `endTime` and `startTime` with the v3.x releases. The `draw_cuepoints` property was removed from v3.0 until v3.5 and reintroduced with v3.6. #### Example The following example configures the player with your source, then adds cuepoints at the `0.5`, `5`, `10`, and `20` second marks. The end time for each cue point is then specified, and a message is assigned for each cuepoint. To see how to make cuepoints visible on the timeline, check the **CSS** tab. ```JavaScript // Configure the player and cuepoints const player = flowplayer('#player', { src: "https://edge.flowplayer.org/bauhaus.m3u8", cuepoints: [ { startTime: 0.5, endTime: 3, text: "Cuepoint 1" }, { startTime: 5, endTime: 7, text: "Cuepoint 2" }, { startTime: 10, endTime: 15, text: "Cuepoint 3" }, { startTime: 20, endTime: 24, text: "Cuepoint 4" } ], draw_cuepoints: true }); ``` ```CSS .fp-cuepoint { background-color: #00abcd !important; height: 100%; cursor: pointer; width: 5px; } ``` ## Listen to plugin events This section describes the events you can capture to control and manage cuepoints within your player instance. To understand event handling differences between CDN or npm implementations, see [Plugin events](/docs/wowza-flowplayer/plugins/about-plugins/#plugin-events). | CDN event | npm event | Description | | --- | --- | --- | | `flowplayer.cuepoints.events.CUEPOINTS` | `Cuepoints.events.CUEPOINTS` | Emitted when new cuepoints are added. | | `flowplayer.cuepoints.events.CUEPOINT_START` | `Cuepoints.events.CUEPOINT_START` | Fires when a cuepoint begins. | | `flowplayer.cuepoints.events.CUEPOINT_END` | `Cuepoints.events.CUEPOINT_END` | Fires when a cuepoint ends. | #### Example If we build on the configuration example earlier on this page, we can create these snippets to listen for cuepoint start and end events: ```javascript const player = flowplayer('#player', { src: "https://edge.flowplayer.org/bauhaus.m3u8", cuepoints: [ { startTime: 0.5, endTime: 3, text: "Cuepoint 1" }, { startTime: 5, endTime: 7, text: "Cuepoint 2" }, { startTime: 10, endTime: 15, text: "Cuepoint 3" }, { startTime: 20, endTime: 24, text: "Cuepoint 4" } ], draw_cuepoints: true }); // Listen for cuepoint start event player.on(flowplayer.cuepoints.events.CUEPOINT_START, function (ev) { console.log("Cuepoint started", ev.detail.cuepoint.text); }); // Listen for cuepoint end event player.on(flowplayer.cuepoints.events.CUEPOINT_END, function () { console.log("Cuepoint ended"); }); ``` ```javascript const player = flowplayer('#player', { src: "https://edge.flowplayer.org/bauhaus.m3u8", cuepoints: [ { startTime: 0.5, endTime: 3, text: "Cuepoint 1" }, { startTime: 5, endTime: 7, text: "Cuepoint 2" }, { startTime: 10, endTime: 15, text: "Cuepoint 3" }, { startTime: 20, endTime: 24, text: "Cuepoint 4" } ], draw_cuepoints: true }); // Listen for cuepoint start event player.on(Cuepoints.events.CUEPOINT_START, function (ev) { console.log("Cuepoint started", ev.detail.cuepoint.text); }); // Listen for cuepoint end event player.on(Cuepoints.events.CUEPOINT_END, function () { console.log("Cuepoint ended"); }); ``` ### Add and remove cuepoints To add and remove cuepoints while playing your media, emit the `CUEPOINTS` event. Then modify the player's `opts.cuepoints` property using ordinary array methods. ```javascript player.emit(flowplayer.cuepoints.events.CUEPOINTS,{ cuepoints: (player.opts.cuepoints || []).concat({ startTime: 30, endTime: 33, text: "Cuepoint 5" }) }); ``` ```javascript player.emit(Cuepoints.events.CUEPOINTS,{ cuepoints: (player.opts.cuepoints || []).concat({ startTime: 30, endTime: 33, text: "Cuepoint 5" }) }); ```