Specification
- Last updated:
Rationale
Rationale
The Elements of HVML
The hvml
Element
Contexts
- Documents
Content Attributes
- XML Root Node Attributes (e.g.
xmlns
) - XML Global Attributes (e.g.
xml:id
)
Definition
This is the root node. Limit one per document. Required.
Authoring
When using the XML serialization of HVML, one and only one XML prolog—e.g. <?xml version="1.0" encoding="UTF-8"?>
—SHOULD be specified before the root node, for the benefit of XML parsers. If an HVML document omits the prolog, or omits either of the two prolog attributes, the document will be assumed to be an XML 1.0 document, and/or encoded using UTF-8, respectively.
Examples
-
A barebones configuration.
Note: Although an attribute-less root element is conforming, this does not provide much context for the document’s contents, and is not recommended in most cases.
<?xml version="1.0" encoding="UTF-8"?> <hvml></hvml>
-
A configuration setting document language to English.
<?xml version="1.0" encoding="UTF-8"?> <hvml xml:lang="en"></hvml>
-
A configuration specifying the HVML namespace, and setting document language to French.
Note: This is the recommended minimum configuration (with document language set appropriately).
<?xml version="1.0" encoding="UTF-8"?> <hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="fr"></hvml>
The title
Element
Contexts
- As a child of
video
- As a child of
venue
Definition
Represents the canonical title for a given video or other creative work.
A canonical title SHOULD be what the resource in question has been named by its author, without any additional information that might be present upon displaying it to a user.
For example, a video appearing in the search results of a video portal site might have the presentational title “Last Day of Summer ’16 | Hugh’s Vlog”. The canonical title would be “Last Day of Summer ’16”. The text after the spacer “ | ” denotes the name of the series, and should not be included in an episode’s <title>
, as it can usually be inferred from the context of the larger document, if authored correctly. To illustrate:
<?xml version="1.0" encoding="UTF-8"?>
<hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="en">
<group xml:id="hughs-vlog" type="series">
<title>Hugh’s Vlog</title>
<!-- … -->
<group xml:id="season-02" type="series">
<!-- … -->
<video xml:id="ep-15">
<title>Last Day of Summer ’16</title>
</video>
</group>
</group>
</hvml>
Given this markup, an HVML-aware CMS could automatically generate the display title “Last Day of Summer ’16 | Hugh’s Vlog”, or alternatively display titles such “Hugh’s Vlog #15: Last Day of Summer ’16”.
However, in the case where one is simply archiving the data of a non-HVML-aware site, which does not have a separate metadata field for series titles, it would be appropriate to include the entire presentational title in a <title>
.
These two use cases can even be covered in the same document without conflict:
<?xml version="1.0" encoding="UTF-8"?>
<hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="en">
<group xml:id="hughs-vlog" type="series">
<title>Hugh’s Vlog</title>
<!-- … -->
<group xml:id="season-02" type="series">
<!-- … -->
<video xml:id="ep-15">
<title>Last Day of Summer ’16</title>
<showing scope="release" datetime="2016-09-10">
<venue type="site" datetime="04:28:03.000Z">
<entity site="https://www.youtube.com/">YouTube</entity>
<uri>https://www.youtube.com/watch?v=YvP_2qi5XuA</uri>
<title>Last Day of Summer ’16 | Hugh’s Vlog</title>
</venue>
</showing>
</video>
</group>
</group>
</hvml>
The video
Element
Contexts
- As a child of
hvml
Content Attributes
- XML Global Attributes (e.g.
xml:id
) -
type
- Required:
- No
- Type:
xs:string
- Values:
narrative
ad
personal
historical
Definition
Represents a single theatrical film, TV show episode, advertisement, home movie, news segment, piece of archival footage, animated GIF, or any other motion picture (i.e., visual media with fixed changes along a temporal axis).
Authoring
The type
attribute accepts one or more of the following values as a space-separated list:
narrative
, indicating that the video in question is a fictional film, usually with a distinct story arc, of any length;documentary
, indicating that the video in question is an investigative, introspective, contemplative, or otherwise educational film of any length;ad
, indicating that the video in question is primarily an advertisement for a product, service, company, or individual, i.e. a commercial. This designation alone is not suitable for videos that merely feature embedded advertisements such as product placement, paid reviews, “ad reads”, or other sponsorships, but are otherwise noncommercial in nature;personal
, indicating that the video in question is primarily from the perspective of an individual, family, friend group, or other close association, and may lack serious artistic direction, such as home movies, or “user-generated content” uploaded to a third-party website;historical
, indicating that the video in question is pertinent to some aspect of history, such as a news program or segment, or miscellaneous footage belonging to a library, archive, or personal collection.
These values can be combined, in any order, in the following ways to derive additional meanings:
narrative documentary
: a documentary with fictionalized elements. This does not refer to disputed or exaggerated claims made in investigative journalism, but rather to hybrid fiction–nonfiction, such as a biopic portrayed by actors that also includes interviews with real-life people relating to the story;personal documentary
: a self-authored vlog (video blog) episode;personal ad
: an advertisement for oneself, such as a political campaign commercial, or a video job application;documentary ad
: an advertisement presented as educational content about a particular topic, e.g. “native advertising”;historical ad
: a commercial for a defunct product or service, or a commercial that is no longer running;historical personal
: a personal video that one has “archived” in order to exclude it or separate it from a list of their recent content in some interface.
When using HVML’s XML serialization in an HTML context, be aware that the User-agent, typically a Web browser, will interpret un-namespaced <video>
s to be instances of HTML’s embedded video player element of the same name. This may result in the browser performing unnecessary work, such as populating the tag with extraneous DOM properties.
To minimize the potential for unwanted browser behavior, HTML’s media-specific attributes (as defined by the WHATWG Living Standard) are reserved attributes in HVML, and will throw errors in conformance checkers if present: autoplay
, buffered
, controls
, crossorigin
, height
, loop
, muted
, preload
, poster
, src
, width
, playsinline
, or any other attribute defined therein.
When using HVML’s XML serialization in an XHTML context (i.e., served with Content-Type: application/xhtml+xml
), unwanted browser behavior can be avoided merely by setting the appropriate namespace, as in one of the following configurations:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8" />
</head>
<body>
<video>
<!-- HTML video definition -->
</video>
<hvml xmlns="https://hypervideo.tech/hvml#">
<video>
<!-- HVML video definition -->
</video>
</hvml>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:hvml="https://hypervideo.tech/hvml#">
<head>
<meta charset="UTF-8" />
</head>
<body>
<video>
<!-- HTML video definition -->
</video>
<hvml:hvml>
<hvml:video>
<!-- HVML video definition -->
</hvml:video>
</hvml:hvml>
</body>
</html>
The series
Element
Contexts
- As a child of
hvml
- As a child of
series
Content Attributes
- XML Global Attributes (e.g.
xml:id
) -
order
- Required:
- No
- Type:
xs:string
- Values:
ascending
descending
custom
Definition
- As a child of
hvml
: Denotes an episodic story, such as a [Web] television show, miniseries, or theatrical anthology. - As a child of another
series
: Denotes a distinct arc of an episodic story, such as a “season” (US parlance) or “series” (UK parlance). Throughout this specification, the term “season” will be used for this use case to avoid ambiguity.
series
is for grouping works that canonically relate to one another, as set forth by their author(s). It is not appropriate for marking up independent curation, i.e. putting together an array of standalone works. For that, see group
[standalone]
Examples
-
Marking up a show with three episodes.
<?xml version="1.0" encoding="UTF-8"?> <hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="en"> <series xml:id="hughs-vlog"> <title>Hugh’s Vlog</title> <video xml:id="episode-01"></video> <video xml:id="episode-02"></video> <video xml:id="episode-03"></video> </series> </hvml>
Note that the
<video>
s’xml:id
attributes are just for human-readability. They are optional and do not have to specify episode numbers. Because this<series>
omits theorder
attribute, its<video>
s are understood to be in ascending chronological order, and can be numbered automatically by a User-agent. -
Marking up a show with three episodes, in reverse chronological order.
<?xml version="1.0" encoding="UTF-8"?> <hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="en"> <series xml:id="hughs-vlog" order="descending"> <title>Hugh’s Vlog</title> <video xml:id="episode-03"></video> <video xml:id="episode-02"></video> <video xml:id="episode-01"></video> </series> </hvml>
-
Marking up a show with six episodes, spread out over two seasons.
<?xml version="1.0" encoding="UTF-8"?> <hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="en"> <series xml:id="hughs-vlog"> <title>Hugh’s Vlog</title> <series xml:id="season-01"> <video xml:id="episode-01"></video> <video xml:id="episode-02"></video> <video xml:id="episode-03"></video> </series> <series xml:id="season-02"> <video xml:id="episode-04"></video> <video xml:id="episode-05"></video> <video xml:id="episode-06"></video> </series> </series> </hvml>
Note that a User-agent might choose to list the episodes in Season 2 as “Episode 4”, “Episode 5”, and “Episode 6”, respectively; or “Season 2: Episode 1”, “Season 2: Episode 2”, and “Season 2: Episode 3” respectively, depending on design decisions.
Parsing
A series
’ children SHOULD be ordered chronologically, so that simply retrieving a list of them would not require additional computation to sort in the majority of use cases. This is referred to as pre-ordering on behalf of the document author.
If the order
attribute is present and set to the exact string ascending
, then the series
’ children MUST be understood as pre-ordered from the earliest date of publication to the latest date of publication.
If the order
attribute is present and set to the exact string descending
, then the series
’ children MUST be understood as pre-ordered from the latest date of publication to the earliest date of publication.
If the order
attribute is present and set to the exact string custom
, then the series
’ children SHOULD NOT be understood as pre-ordered in a consistently linear fashion. User-agents wanting to sort a series
’ children by date anyway in this case should look for grandchild published
elements. If a given child has no published
child, its place in a sort is left to the User-agent.
If the order
attribute is present but set to a non-empty string that the User-agent doesn’t recognize, the pre-order defaults to custom
to gracefully degrade in the event of future permissible values.
If the order
attribute is not present, or is present but empty, the pre-order defaults to ascending
.
The group
Element
Contexts
- As a child of
series
- As a child of
group
Content Attributes
- XML Global Attributes (e.g.
xml:id
) -
type
- Required:
- No
- Type:
xs:string
- Values:
curation
Definition
An arbitrary grouping.
Examples
-
Marking up a curated list of episodes.
<?xml version="1.0" encoding="UTF-8"?> <hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="en"> <series xml:id="hughs-vlog"> <title>Hugh’s Vlog</title> <group xml:id="best-of-hughs-vlog" type="curation"> <video xml:id="episode-01"></video> <video xml:id="episode-03"></video> <video xml:id="episode-05"></video> </group> </series> </hvml>
-
Marking up a curated list of episodes from a previously-defined set of episodes.
For this we must import the
xlink
namespace on the root node, in order to usexlink:href
to target specificxml:id
s.<?xml version="1.0" encoding="UTF-8"?> <hvml xmlns="https://hypervideo.tech/hvml#" xmlns:xlink="http://www.w3.org/1999/xlink" xml:lang="en" > <series xml:id="hughs-vlog"> <title>Hugh’s Vlog</title> <series xml:id="season-01"> <video xml:id="episode-01"></video> <video xml:id="episode-02"></video> <video xml:id="episode-03"></video> <video xml:id="episode-04"></video> <video xml:id="episode-05"></video> </series> <group xml:id="best-of-hughs-vlog" type="curation"> <video xml:id="best-of-01" xlink:href="#episode-01"></video> <video xml:id="best-of-02" xlink:href="#episode-03"></video> <video xml:id="best-of-03" xlink:href="#episode-05"></video> </group> </series> </hvml>
The rating
Element
Contexts
- As a child of
glossary
- As a child of
rating
Content Attributes
- XML Global Attributes (e.g.
xml:id
) -
type
- Required:
- Maybe
- Type:
xs:string
- Values:
drugs
nudity
profanity
sex
suggestive-dialogue
violence
custom
-
code
- Required:
- No
- Type:
xs:string
- Purpose:
- Sets a locally-unique identifier for the
rating
definition or one of its components.
-
maturity
- Required:
- No
- Type:
xs:nonNegativeInteger
- Values:
- Range: 0–1 inclusive
- Purpose:
- Sets the relative maturity level of a
rating
definition.
-
color
- Required:
- No
- Type:
xs:string
- Values:
- Any valid CSS color value
- Purpose:
- Sets the canonical color representation for the rating level, typically indicating “severity” by way of color warmth. Does not guarantee faithful rendering by a User-agent, which may decide on other design treatments such as monochrome or high-contrast.
Definition
A content rating with which an Author can classify a piece of content.
Authoring
The type
attribute accepts one or more values as a space-separated list. When it contains a list, any or all of the values may apply to the definition, depending on the rules of the rating system.
If the type
attribute is not present, or is present but empty, any or all of the <rating>
’s possible types, excluding custom
, may apply.
If a rating
element has another <rating>
as its parent, and the parent has a type
attribute, then the child’s type
attribute is inherited from the parent and is optional. Otherwise, it is required.
If both the parent and the child <rating>
s have type
s that don’t match, then the child <rating>
’s type
takes precedence.
The maturity
attribute defines the rating level relative to other rating
s on a scale from 0 to 1 inclusive, 0 meaning “little to no maturity required” to safely consume a piece of content (however that is defined by the rating system); 1 meaning “a lot of maturity required”.
If maturity
is omitted and there is more than one <rating>
for a given <glossary>
, then maturity
is calculated automatically as an even distribution according to the top-down source order starting at 0. So, for a set of five <rating>
s without maturity
s set, their maturitys
would be calculated by a User-agent as 0, 0.25, 0.5, 0.75, and 1 respectively. This is referred to as pre-ordering on behalf of the Author.
If maturity
is omitted on the only <rating>
for a given <glossary>
, then the <rating>
represents a binary rating rating and its maturity is equal to 1.
Examples
-
Defining the content rating for a video.
<?xml version="1.0" encoding="UTF-8"?> <hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="en"> <video type="feature" xml:id="drive-2011"> <title>Drive</title> <published>2011-05-20</published> <rating code="R" /> </video> </hvml>
On its own, all this says is that someone has used the letter “R” to indicate the recommended maturity level for the video’s audience. While most US moviegoers might understand this to be an abbreviation for “Restricted” as assigned by the MPAA, its meaning and origin may not be clear to non-US audiences or robots.
-
In order to provide better context, the previous example can be expanded to:
<?xml version="1.0" encoding="UTF-8"?> <hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="en"> <video type="feature" xml:id="drive-2011"> <title>Drive</title> <published>2011-05-20</published> <rating code="R" maturity="0.75"> <entity> <name>Motion Picture Association of America</name> <nickname>MPAA</nickname> <site title="MPAA.org">https://www.mpaa.org</site> </entity> <title>Restricted</title> <subtitle>Children Under 17 Require Accompanying Parent or Adult Guardian</subtitle> <description>An R-rated motion picture, in the view of the Rating Board, contains some adult material. An R-rated motion picture may include adult themes, adult activity, hard language, intense or persistent violence, sexually-oriented nudity, drug abuse or other elements, so that parents are counseled to take this rating very seriously. Children under 17 are not allowed to attend R-rated motion pictures unaccompanied by a parent or adult guardian. Parents are strongly urged to find out more about R-rated motion pictures in determining their suitability for their children. Generally, it is not appropriate for parents to bring their young children with them to R-rated motion pictures.</description> <reason type="violence profanity nudity">strong brutal bloody violence, language and some nudity</reason> </rating> </video> </hvml>
However, this would be a lot to include in a document or database describing multiple “R”-rated movies, so it is usually more economical to outsource most of the definition to a
glossary
, and link to that from thevideo
’s localrating
. -
By linking via
code
, the appliedrating
references all of the glossaryrating
’s data, as if it were contained inline.<?xml version="1.0" encoding="UTF-8"?> <hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="en"> <meta> <glossary xml:id="mpaa" for="rating" party="3rd"> <title>MPAA Ratings</title> <scheme>https://filmratings.com/Content/Downloads/rating_rules.pdf</scheme> <rating xml:id="mpaa-g" code="G" maturity="0"> <title>General Audiences</title> <subtitle>General Audiences</subtitle> </rating> <!-- … --> <rating xml:id="mpaa-r" code="R" maturity="0.75"> <title>Restricted</title> <subtitle>Children Under 17 Require Accompanying Parent or Adult Guardian</subtitle> </rating> </glossary> </meta> <video type="feature" xml:id="drive-2011"> <title>Drive</title> <published>2011-05-20</published> <rating code="R"> <reason type="violence profanity nudity">strong brutal bloody violence, language and some nudity</reason> </rating> </video> </hvml>
-
To disambiguate between clashing codes, the applied
rating
uses glossary scoping.<?xml version="1.0" encoding="UTF-8"?> <hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="en"> <meta> <glossary xml:id="mpaa" for="rating" party="3rd"> <title>MPAA Ratings</title> <scheme>https://filmratings.com/Content/Downloads/rating_rules.pdf</scheme> <rating xml:id="mpaa-r" code="R" maturity="0.75"> <title>Restricted</title> <subtitle>Children Under 17 Require Accompanying Parent or Adult Guardian</subtitle> </rating> </glossary> <glossary xml:id="joe-cool" for="rating" party="3rd"> <title>Joe Cool’s Ratings</title> <scheme>http://peanuts.wikia.com/wiki/Joe_Cool</scheme> <rating xml:id="joe-cool-r" code="R" maturity="0"> <title>Really Cool</title> <subtitle>Children Under 17 Don’t Require Jack, Man.</subtitle> </rating> </glossary> </meta> <video type="feature" xml:id="drive-2011"> <title>Drive</title> <published>2011-05-20</published> <rating glossary="#mpaa" code="R"> <reason type="violence profanity nudity">strong brutal bloody violence, language and some nudity</reason> </rating> </video> </hvml>
-
Alternatively,
rating
s can link to glossary definitions by ID. This requires importing thexlink
namespace on the root node.<?xml version="1.0" encoding="UTF-8"?> <hvml xmlns="https://hypervideo.tech/hvml#" xmlns:xlink="http://www.w3.org/1999/xlink" xml:lang="en" > <meta> <glossary xml:id="mpaa" for="rating" party="3rd"> <title>MPAA Ratings</title> <scheme>https://filmratings.com/Content/Downloads/rating_rules.pdf</scheme> <rating xml:id="mpaa-g" code="G" maturity="0"> <title>General Audiences</title> <subtitle>General Audiences</subtitle> </rating> <!-- … --> <rating xml:id="mpaa-r" code="R" maturity="0.75"> <title>Restricted</title> <subtitle>Children Under 17 Require Accompanying Parent or Adult Guardian</subtitle> </rating> </glossary> </meta> <video type="feature" xml:id="drive-2011"> <title>Drive</title> <published>2011-05-20</published> <rating xlink:href="#mpaa-r"> <reason type="violence profanity nudity">strong brutal bloody violence, language and some nudity</reason> </rating> </video> </hvml>
-
Defining a glossary of three
profanity
content ratings, on a scale from least profane to most profane.<?xml version="1.0" encoding="UTF-8"?> <hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="en"> <glossary xml:id="yt" for="ratings"> <title>YouTube Content Rating</title> <scheme>https://support.google.com/youtube/answer/146399?hl=en</scheme> <rating type="profanity"> <rating code="L-" color="green"> <title>None</title> </rating> <rating code="L" color="yellow"> <title>Strong language</title> </rating> <rating code="L+" color="red"> <title>Explicit language</title> </rating> </rating> </glossary> </hvml>
-
Defining a glossary of three
profanity
content ratings, on a scale from least profane to most profane, with explicit maturity ranking.<?xml version="1.0" encoding="UTF-8"?> <hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="en"> <glossary xml:id="yt" for="ratings"> <title>YouTube Content Rating</title> <scheme>https://support.google.com/youtube/answer/146399?hl=en</scheme> <rating type="profanity"> <rating code="L-" maturity="0" color="green"> <title>None</title> </rating> <rating code="L" maturity="0.5" color="yellow"> <title>Strong language</title> </rating> <rating code="L+" maturity="1" color="red"> <title>Explicit language</title> </rating> </rating> </glossary> </hvml>
-
Defining a binary content rating, with an implied maturity of
1
.<?xml version="1.0" encoding="UTF-8"?> <hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="en"> <glossary xml:id="pal" for="ratings"> <title>Parental Advisory Label</title> <scheme>https://www.riaa.com/resources-learning/pal-standards/</scheme> <rating type="profanity sex violence drugs" code="PAL"> <title>Parental Advisory Label</title> </rating> </glossary> </hvml>
Parsing
If the type
attribute is present and set to an unrecognized, non-empty string, interpret the type
as being set to the exact string custom
, to gracefully degrade in the event of future permissible values.
If the type
attribute is present and set to the exact string custom
, then the <rating>
has nonstandard semantics which the User-agent MAY infer from heuristics.
The verdict
Element
Contexts
- As a child of
glossary
- As a child of
group
Content Attributes
- XML Global Attributes (e.g.
xml:id
) -
code
- Required:
- No
- Type:
xs:string
-
rank
- Required:
- No
- Type:
xs:nonNegativeInteger
- Values:
- Range: 0–1 inclusive
Definition
A predefined verdict with which a reviewer can rank a piece of content.
Examples
1.
<?xml version="1.0" encoding="UTF-8"?>
<hvml xmlns="https://hypervideo.tech/hvml#" xml:lang="en">
<glossary xml:id="nstv" for="score" party="1st">
<title>No Spoon TV Verdicts</title>
<group>
<verdict xml:id="nstv-u" code="U" rank="0">
<title>Unwatchable</title>
</verdict>
<!-- … -->
<verdict xml:id="nstv-ma" code="Ma" rank="1">
<title>Masterpiece</title>
</verdict>
</group>
</glossary>
</hvml>
Glossary of Terms
- empty string
- Any of
NULL
, the empty string, or pure whitespace - non-empty string
- Any sequence of characters excluding
NULL
, the empty string, and pure whitespace - locally-unique identifier
- A sequence of characters used to identify an element subtree that does not recur as an identifier within its nearest scoped ancestor, such as
glossary
, but may recur beyond that boundary.