Comment on page
Advanced Workflows
Annoto widget position is set as
absolute
meaning it doesn't influence the website layout. By default the application is contained inside a single DIV that is appended to the BODY.If you require different behavior, you can put the following DIV anywhere in your DOM:
<div id="annoto-app"></div>
Once this DIV element is present in the DOM, when Annoto.boot() is called, it would be detected automatically by Annoto and serve as container for the Annoto app.
This is especially useful if BODY is not your main scrollable layout.
As a rule of thumb always place the container in the same scrollable element as your video.
When the Annoto widget is closed a small Fab button with comments icon is positioned next to the player to allow users to open the widget.
In some cases you might want to implement your own open/close UI and functionality.
var config = {
ux: {
widget: {
fabDisable: true
}
}
// ...
};
To show/hide the widget, use the IAnnotoApi show() and hide() methods. For more details on how to obtain the api object please refer to Using the API.
Annoto Timeline allows users to spot points of interest. The timeline can be embedded in the player or it can be positioned below the player. Lets explore the timeline configuration options:
By default, the timeline will be positioned under the player:

timeline: {
overlay: true
}

If Annoto is integrated in a 3d party system that is taking the role of LTI Tool that processes the LTI messaging requests, Annoto still supports taking care of managing the outcomes reporting.
The above setup requires the below configurations.
Once setup, Annoto backend services will take care of always keeping the grades up to date, including retries (in case of LMS rate limiting).
During
LtiResourceLinkRequest
the LMS (Platform) provides the following claims:https://purl.imsglobal.org/spec/lti-ags/claim/endpoint
https://purl.imsglobal.org/spec/lti/claim/resource_link
Example Configuration
Media details Outcomes Interface
const annotoConfig: IConfig = {
hooks: {
mediaDetails: () => {
return {
outcomes: {
clientId: "7f84098a3f85",
integrationKey: 'U0N7wvTXdXTIx3A204tWg',
lti: {
userId: 'abc123',
resourceLinkId: 'xyz321',
claim: {
lineitems: 'https://example.lms.site/48c52e65-5fb9-4099-9b2e',
scope: [
'https://purl.imsglobal.org/spec/lti-ags/scope/lineitem',
'https://purl.imsglobal.org/spec/lti-ags/scope/lineitem.readonly',
'https://purl.imsglobal.org/spec/lti-ags/scope/score',
'https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly',
],
},
},
},
title: 'Quick Start',
// id: '7245-asfa', // (optional) unique media identifier
// description: 'Quick start for setup on custom platform', // (optional)
};
}
},
// rest of the widget configuration
};
export interface IOutcomes {
/**
* integration key provided by Annoto during setup
* required if lti object is provided
*/
integrationKey?: string;
/**
* LTI outcomes parameters provided by the platform during launch
*/
lti?: ILtiAGSOutcome;
/**
* if set to true, outcome passback support is expected for the activity, and if not
* present via this config (or other means), a warning to user will be shown
* notifying of potential issue with passing back grades to 3d party platform (such as LMS)
* @default true
*/
isExpected?: boolean;
}
export interface ILtiAGSOutcome {
/**
* Tool deployment client_id
* If provided will be forwarded in the Webhook outcome messages
*/
clientId?: string;
/**
* The userId MUST be present and MUST be the same as the resource link LTI parameter 'user_id'.
*/
userId: string;
/**
* id of the https://purl.imsglobal.org/spec/lti/claim/resource_link claim
*/
resourceLinkId: string;
/**
* This claim is included in LTI messages if any of the
* Assignment and Grade Services are accessible by the tool in the context of the LTI message.
* https://www.imsglobal.org/spec/lti-ags/v2p0#assignment-and-grade-service-claim
*/
claim: {
/**
* the endpoint URL for accessing the line item container for the current context.
*/
lineitems: string;
/**
* when an LTI message is launching a resource associated to one and only one lineitem,
* the claim must include the endpoint URL for accessing the associated line item;
* in all other cases, this property must be either blank or not included in the claim.
*/
lineitem?: string;
/**
* An array of scopes the tool may ask an access token for.
*/
scope?: LtiAGSScopeType[];
}
}
integrationKey
is provided by Annoto during setup.Annoto providers ends users, advanced interaction with video content. In order to do it Annoto requires access to video player API. Before Annoto can perform any action it must obtain the media source and the duration of the media.
We already support a variety of widely used player types, and constantly adding new ones. If you are using a custom player or player we don't support yet, you have 2 options:
- 1.Implement a PlayerAdaptorApi and set it in Widget's player configuration. Contributions are very welcome and appreciated :)
- 2.
Annoto widget exposes api to subscribe to analytics events so that can be used in custom integrations, for example ingested and analyzed by custom BI systems.
The widget provides two types of events:
Discrete events of user actions such as submit a comment, vote, read a reply, click on timestamp, first video play, etc.
Annoto.on('stats_events', function (ev) {
console.log(ev);
});
For more details on the event callback please refer to the AnnotoStatsEventCallback interface. For full list of event types, please refer to StatsTypeEnum.
Video analytics events that provides details about the current and historical accumulated video consumption of the user.
Annoto.on('video_benchmark', function (ev) {
console.log(ev);
});
Interactions events of user actions that provide details about interactions consumed and the results of the activity.
Annoto.on('cta_stats_events', function (ev) {
console.log(ev);
});
Last modified 4mo ago