diff --git a/CHANGELOG b/CHANGELOG index 8d55fdf9..8b09f976 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,13 @@ +Release 130 (2021-12-01) +------------------------ +Add schemas/nl.basjes/yauaa_context/jsonschema/1-0-3 (#1126) +Add com.snowplowanalytics.snowplow/identify/jsonschema/1-0-0 (#1185) +Add com.youtube/youtube/jsonschema/1-0-0 (#1180) +Add org.whatwg/video_element/jsonschema/1-0-0 (#1179) +Add org.whatwg/media_element/jsonschema/1-0-0 (#1178) +Add com.snowplowanalytics.snowplow/media_player_event/jsonschema/1-0-0 (#1177) +Add com.snowplowanalytics.snowplow/media_player/jsonschema/1-0-0 (#1176) + Release 129 (2021-11-01) ------------------------ Infrastructure: Push schema lists to Iglu Central (#1181) diff --git a/LICENSE-2.0.txt b/LICENSE similarity index 100% rename from LICENSE-2.0.txt rename to LICENSE diff --git a/README.md b/README.md index c9e8b7bb..1519e742 100644 --- a/README.md +++ b/README.md @@ -49,11 +49,11 @@ limitations under the License. [cd]: https://github.com/snowplow/iglu-central/actions?query=workflow%3ACI [cd-image]: https://github.com/snowplow/iglu-central/workflows/CI/badge.svg -[release-image]: http://img.shields.io/badge/release-128-orange.svg?style=flat +[release-image]: https://img.shields.io/github/v/release/snowplow/iglu-central [releases]: https://github.com/snowplow/iglu-central/releases -[license-image]: http://img.shields.io/badge/license-Apache--2-blue.svg?style=flat -[license]: http://www.apache.org/licenses/LICENSE-2.0 +[license-image]: https://img.shields.io/github/license/snowplow/iglu-central +[license]: https://www.apache.org/licenses/LICENSE-2.0 [iglucentral-website]: http://iglucentral.com [snowplow-repo]: https://github.com/snowplow/snowplow diff --git a/schemas/com.snowplowanalytics.snowplow/identify/jsonschema/1-0-0 b/schemas/com.snowplowanalytics.snowplow/identify/jsonschema/1-0-0 new file mode 100644 index 00000000..af29d1da --- /dev/null +++ b/schemas/com.snowplowanalytics.snowplow/identify/jsonschema/1-0-0 @@ -0,0 +1,25 @@ +{ + "$schema": "http://iglucentral.com/schemas/com.snowplowanalytics.self-desc/schema/jsonschema/1-0-0#", + "self": { + "vendor": "com.snowplowanalytics.snowplow", + "name": "identify", + "version": "1-0-0", + "format": "jsonschema" + }, + "description": "A Snowplow identify event.", + "type": "object", + "properties": { + "id": { + "description": "The user identifier.", + "type": ["string", "null"], + "maxLength": 256 + }, + "email": { + "description": "The user email address.", + "type": ["string", "null"], + "maxLength": 256 + } + + }, + "additionalProperties": false +} diff --git a/schemas/com.snowplowanalytics.snowplow/media_player/jsonschema/1-0-0 b/schemas/com.snowplowanalytics.snowplow/media_player/jsonschema/1-0-0 new file mode 100644 index 00000000..4a99efbd --- /dev/null +++ b/schemas/com.snowplowanalytics.snowplow/media_player/jsonschema/1-0-0 @@ -0,0 +1,80 @@ +{ + "$schema": "http://iglucentral.com/schemas/com.snowplowanalytics.self-desc/schema/jsonschema/1-0-0#", + "description": "Common Context Schema for a media player event", + "self": { + "vendor": "com.snowplowanalytics.snowplow", + "name": "media_player", + "format": "jsonschema", + "version": "1-0-0" + }, + "type": "object", + "properties": { + "currentTime": { + "type": "number", + "description": "The current playback time", + "minimum": 0, + "maximum": 9007199254740991 + }, + "duration": { + "type": [ + "number", + "null" + ], + "description": "A double-precision floating-point value indicating the duration of the media in seconds", + "minimum": 0, + "maximum": 9007199254740991 + }, + "ended": { + "type": "boolean", + "description": "If playback of the media has ended" + }, + "isLive": { + "type": "boolean", + "description": "If the media is live" + }, + "loop": { + "type": "boolean", + "description": "If the video should restart after ending" + }, + "muted": { + "type": "boolean", + "description": "If the media element is muted" + }, + "paused": { + "type": "boolean", + "description": "If the media element is paused" + }, + "percentProgress": { + "type": [ + "integer", + "null" + ], + "description": "The percent of the way through the media", + "minimum": 0, + "maximum": 100 + }, + "playbackRate": { + "type": "number", + "description": "Playback rate (1 is normal)", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "volume": { + "type": "integer", + "description": "Volume percent", + "minimum": 0, + "maximum": 100 + } + }, + "additionalProperties": false, + "required": [ + "currentTime", + "duration", + "ended", + "loop", + "muted", + "paused", + "playbackRate", + "volume" + ] +} diff --git a/schemas/com.snowplowanalytics.snowplow/media_player_event/jsonschema/1-0-0 b/schemas/com.snowplowanalytics.snowplow/media_player_event/jsonschema/1-0-0 new file mode 100644 index 00000000..8f23aee7 --- /dev/null +++ b/schemas/com.snowplowanalytics.snowplow/media_player_event/jsonschema/1-0-0 @@ -0,0 +1,31 @@ +{ + "$schema": "http://iglucentral.com/schemas/com.snowplowanalytics.self-desc/schema/jsonschema/1-0-0#", + "description": "Schema for a media event", + "self": { + "vendor": "com.snowplowanalytics.snowplow", + "name": "media_player_event", + "format": "jsonschema", + "version": "1-0-0" + }, + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The event fired by the media player", + "maxLength": 255 + }, + "label": { + "type": [ + "string", + "null" + ], + "description": "A custom identifier", + "maxLength": 4096 + } + }, + "required": [ + "type" + ], + "additionalProperties": false +} + diff --git a/schemas/com.youtube/youtube/jsonschema/1-0-0 b/schemas/com.youtube/youtube/jsonschema/1-0-0 new file mode 100644 index 00000000..f03c4a80 --- /dev/null +++ b/schemas/com.youtube/youtube/jsonschema/1-0-0 @@ -0,0 +1,158 @@ +{ + "$schema": "http://iglucentral.com/schemas/com.snowplowanalytics.self-desc/schema/jsonschema/1-0-0#", + "description": "Context Schema for a youtube player event", + "self": { + "vendor": "com.youtube", + "name": "youtube", + "format": "jsonschema", + "version": "1-0-0" + }, + "type": "object", + "properties": { + "avaliablePlaybackRates": { + "type": "array", + "description": "An array of playback rates in which the current video is available", + "items": { + "type": "number", + "minimum": 0, + "maximum": 128 + } + }, + "avaliableQualityLevels": { + "type": ["array", "null"], + "description": "An array of quality levels in which the current video is available", + "items": { + "type": "string", + "maxLength": 128 + } + }, + "cued": { + "type": "boolean", + "description": "If the video is cued" + }, + "playerId": { + "type": "string", + "description": "The HTML id of the video element", + "maxLength": 65535 + }, + "autoPlay": { + "type": "boolean", + "description": "This specifies whether the initial video will automatically start to play when the player loads." + }, + "buffering": { + "type": "boolean", + "description": "If the player is buffering" + }, + "controls": { + "type": "boolean", + "description": "Whether the video player controls are displayed" + }, + "error": { + "type": [ + "string", + "null" + ], + "description": "A string of the latest error to occur, or null if no errors", + "enum": [ + "INVALID_PARAMETER", + "HTML5_PLAYER_ERROR", + "NOT_FOUND", + "EMBED_DISALLOWED" + ] + }, + "loaded": { + "type": "integer", + "description": "The percentage of the video that the player shows as buffered", + "minimum": 0, + "maximum": 100 + }, + "origin": { + "type": [ + "string", + "null" + ], + "description": "The origin domain of the embed", + "maxLength": 65535 + }, + "playbackQuality": { + "type": "string", + "description": "The quality level of the current video", + "maxLength": 128 + }, + "playlist": { + "type": [ + "array", + "null" + ], + "description": "An array of the video IDs in the playlist as they are currently ordered." + }, + "playlistIndex": { + "type": [ + "number", + "null" + ], + "description": "The index of the playlist video that is currently playing", + "minimum": 0, + "maximum": 65535 + }, + "unstarted": { + "type": "boolean", + "description": "If the player hasn't started" + }, + "url": { + "type": "string", + "description": "The YouTube embed URL of the media resource", + "maxLength": 65535, + "format": "uri" + }, + "fov": { + "type": [ + "number", + "null" + ], + "description": "The field-of-view of the view in degrees, as measured along the longer edge of the viewport", + "minimum": 30, + "maximum": 120 + }, + "roll": { + "type": [ + "number", + "null" + ], + "description": "The clockwise or counterclockwise rotational angle of the view in degrees", + "minimum": -180, + "maximum": 180 + }, + "pitch": { + "type": [ + "number", + "null" + ], + "description": "The vertical angle of the view in degrees", + "minimum": -90, + "maximum": 90 + }, + "yaw": { + "type": [ + "number", + "null" + ], + "description": "The horizontal angle of the view in degrees", + "minimum": 0, + "maximum": 360 + } + }, + "additionalProperties": false, + "required": [ + "avaliablePlaybackRates", + "autoPlay", + "buffering", + "controls", + "cued", + "loaded", + "playbackQuality", + "playerId", + "unstarted", + "url" + ] +} diff --git a/schemas/nl.basjes/yauaa_context/jsonschema/1-0-3 b/schemas/nl.basjes/yauaa_context/jsonschema/1-0-3 new file mode 100644 index 00000000..b3bc226e --- /dev/null +++ b/schemas/nl.basjes/yauaa_context/jsonschema/1-0-3 @@ -0,0 +1,231 @@ +{ + "$schema": "http://iglucentral.com/schemas/com.snowplowanalytics.self-desc/schema/jsonschema/1-0-0#", + "description": "Schema for a context generated by the YAUAA enrichment after parsing the user agent", + "self": { + "vendor": "nl.basjes", + "name": "yauaa_context", + "format": "jsonschema", + "version": "1-0-3" + }, + "type": "object", + "properties": { + "deviceClass": { + "description": "See https://yauaa.basjes.nl/README-Output.html", + "enum": ["Desktop", "Anonymized", "Unknown", "UNKNOWN", "Mobile", "Tablet", "Phone", "Watch", "Virtual Reality", "eReader", "Set-top box", "TV", "Game Console", "Handheld Game Console", "Voice", "Robot", "Robot Mobile", "Spy", "Hacker", "Augmented Reality", "Robot Imitator"] + }, + "deviceName": { + "description": "Example: Google Nexus 6", + "type": "string", + "maxLength": 100 + }, + "deviceBrand": { + "description": "Example: Google", + "type": "string", + "maxLength": 50 + }, + "deviceCpu": { + "type": "string", + "maxLength": 50 + }, + "deviceCpuBits": { + "type": "string", + "maxLength": 20 + }, + "deviceFirmwareVersion": { + "type": "string", + "maxLength": 100 + }, + "deviceVersion": { + "type": "string", + "maxLength": 100 + }, + "operatingSystemClass": { + "description": "See https://yauaa.basjes.nl/README-Output.html", + "enum": ["Desktop", "Mobile", "Cloud", "Embedded", "Game Console", "Hacker", "Anonymized", "Unknown"] + }, + "operatingSystemName": { + "description": "Examples: Linux, Android.", + "type": "string", + "maxLength": 100 + }, + "operatingSystemVersion": { + "type": "string", + "maxLength": 50 + }, + "operatingSystemNameVersion": { + "type": "string", + "maxLength": 150 + }, + "operatingSystemVersionBuild": { + "type": "string", + "maxLength": 100 + }, + "layoutEngineClass": { + "description": "See https://yauaa.basjes.nl/README-Output.html", + "enum": ["Browser", "Mobile App", "Hacker", "Robot", "Unknown", "Special", "Cloud", "eReader"] + }, + "layoutEngineName": { + "type": "string", + "maxLength": 100 + }, + "layoutEngineVersion": { + "type": "string", + "maxLength": 50 + }, + "layoutEngineVersionMajor": { + "type": "string", + "maxLength": 20 + }, + "layoutEngineNameVersion": { + "type": "string", + "maxLength": 150 + }, + "layoutEngineNameVersionMajor": { + "type": "string", + "maxLength": 120 + }, + "layoutEngineBuild": { + "type": "string", + "maxLength": 100 + }, + "agentClass": { + "description": "See https://yauaa.basjes.nl/README-Output.html", + "enum": ["Browser", "Browser Webview", "Mobile App", "Robot", "Robot Mobile", "Cloud Application", "Email Client", "Voice", "Special", "Testclient", "Hacker", "Unknown", "Desktop App", "eReader"] + }, + "agentName": { + "description": "Example: Chrome.", + "type": "string", + "maxLength": 100 + }, + "agentVersion": { + "type": "string", + "maxLength": 100 + }, + "agentVersionMajor": { + "type": "string", + "maxLength": 100 + }, + "agentNameVersion": { + "type": "string", + "maxLength": 200 + }, + "agentNameVersionMajor": { + "type": "string", + "maxLength": 120 + }, + "agentBuild": { + "type": "string", + "maxLength": 100 + }, + "agentLanguage": { + "type": "string", + "maxLength": 50 + }, + "agentLanguageCode": { + "type": "string", + "maxLength": 20 + }, + "agentInformationEmail": { + "type": "string", + "format": "email" + }, + "agentInformationUrl": { + "type": "string" + }, + "agentSecurity": { + "type": "string", + "enum": ["Weak security", "Strong security", "Unknown", "Hacker", "No security"] + }, + "agentUuid": { + "type": "string" + }, + "webviewAppName": { + "type": "string" + }, + "webviewAppVersion": { + "type": "string" + }, + "webviewAppVersionMajor": { + "type": "string", + "maxLength": 50 + }, + "webviewAppNameVersionMajor": { + "type": "string", + "maxLength": 50 + }, + "facebookCarrier": { + "type": "string" + }, + "facebookDeviceClass": { + "type": "string", + "maxLength": 1024 + }, + "facebookDeviceName": { + "type": "string", + "maxLength": 1024 + }, + "facebookDeviceVersion": { + "type": "string" + }, + "facebookFBOP": { + "type": "string" + }, + "facebookFBSS": { + "type": "string" + }, + "facebookOperatingSystemName": { + "type": "string" + }, + "facebookOperatingSystemVersion": { + "type": "string" + }, + "anonymized": { + "type": "string" + }, + "hackerAttackVector": { + "type": "string" + }, + "hackerToolkit": { + "type": "string" + }, + "koboAffiliate": { + "type": "string" + }, + "koboPlatformId": { + "type": "string" + }, + "iECompatibilityVersion": { + "type": "string", + "maxLength": 100 + }, + "iECompatibilityVersionMajor": { + "type": "string", + "maxLength": 50 + }, + "iECompatibilityNameVersion": { + "type": "string", + "maxLength": 50 + }, + "iECompatibilityNameVersionMajor": { + "type": "string", + "maxLength": 70 + }, + "carrier": { + "type": "string" + }, + "gSAInstallationID": { + "type": "string" + }, + "networkType": { + "type": "string" + }, + "operatingSystemNameVersionMajor": { + "type": "string" + }, + "operatingSystemVersionMajor": { + "type": "string" + } + }, + "required": ["deviceClass"], + "additionalProperties": false +} diff --git a/schemas/org.whatwg/media_element/jsonschema/1-0-0 b/schemas/org.whatwg/media_element/jsonschema/1-0-0 new file mode 100644 index 00000000..a5d8c74a --- /dev/null +++ b/schemas/org.whatwg/media_element/jsonschema/1-0-0 @@ -0,0 +1,264 @@ +{ + "$schema": "http://iglucentral.com/schemas/com.snowplowanalytics.self-desc/schema/jsonschema/1-0-0#", + "description": "Context Schema for a media player event", + "self": { + "format": "jsonschema", + "name": "media_element", + "vendor": "org.whatwg", + "version": "1-0-0" + }, + "type": "object", + "properties": { + "autoPlay": { + "type": "boolean", + "description": "If playback should automatically begin as soon as enough media is available to do so without interruption" + }, + "buffered": { + "description": "An array of time ranges that have been buffered", + "items": { + "type": "object", + "description": "A time range object", + "properties": { + "start": { + "description": "The beginning of the time range", + "maximum": 9007199254740991, + "minimum": 0, + "type": "number" + }, + "end": { + "description": "The end of the time range", + "maximum": 9007199254740991, + "minimum": 0, + "type": "number" + } + }, + "additionalProperties": false + }, + "type": "array" + }, + "controls": { + "type": "boolean", + "description": "If the user agent should provide it's own set of controls" + }, + "crossOrigin": { + "type": [ + "string", + "null" + ], + "description": "CORS settings value of the media player", + "maxLength": 255 + }, + "currentSrc": { + "type": "string", + "description": "The absolute URL of the media resource", + "maxLength": 65535, + "format": "uri" + }, + "defaultMuted": { + "type": "boolean", + "description": "If audio is muted by default" + }, + "defaultPlaybackRate": { + "type": "number", + "description": "The default media playback rate of the player", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "disableRemotePlayback": { + "type": [ + "boolean", + "null" + ], + "description": "If the media element is allowed to have a remote playback UI" + }, + "error": { + "type": [ + "object", + "null" + ], + "description": "An object of the latest error to occur, or null if no errors" + }, + "fileExtension": { + "type": [ + "string", + "null" + ], + "description": "The media file format", + "maxLength": 255, + "minLength": 1 + }, + "fullscreen": { + "type": [ + "boolean", + "null" + ], + "description": "If the video element is fullscreen" + }, + "mediaType": { + "type": "string", + "description": "If the media is a video element, or audio", + "enum": [ + "AUDIO", + "VIDEO" + ], + "maxLength": 5 + }, + "networkState": { + "description": "The current state of the fetching of media over the network", + "enum": [ + "NETWORK_EMPTY", + "NETWORK_IDLE", + "NETWORK_LOADING", + "NETWORK_NO_SOURCE" + ], + "type": "string" + }, + "pictureInPicture": { + "description": "If the video element is showing Picture-In-Picture", + "type": [ + "boolean", + "null" + ] + }, + "played": { + "type": [ + "array", + "null" + ], + "description": "An array of time ranges played", + "items": { + "type": "object", + "description": "A time range", + "properties": { + "start": { + "type": "number", + "description": "The beginning of the time range", + "minimum": 0, + "maximum": 9007199254740991 + }, + "end": { + "type": "number", + "description": "The end of the time range", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "htmlId": { + "type": "string", + "description": "The HTML id of the element", + "maxLength": 65535 + }, + "preload": { + "type": "string", + "description": "The 'preload' HTML attribute of the media", + "maxLength": 65535 + }, + "readyState": { + "type": "string", + "description": "The readiness of the media", + "enum": [ + "HAVE_NOTHING", + "HAVE_METADATA", + "HAVE_CURRENT_DATA", + "HAVE_FUTURE_DATA", + "HAVE_ENOUGH_DATA" + ] + }, + "seekable": { + "type": "array", + "description": "Seekable time range(s)", + "items": { + "type": "object", + "description": "A time range", + "properties": { + "end": { + "description": "The end of the time range", + "maximum": 9007199254740991, + "minimum": 0, + "type": "number" + }, + "start": { + "description": "The beginning of the time range", + "maximum": 9007199254740991, + "minimum": 0, + "type": "number" + } + }, + "additionalProperties": false + } + }, + "seeking": { + "type": "boolean", + "description": "If the media is in the process of seeking to a new position" + }, + "src": { + "type": "string", + "description": "The 'src' HTML attribute of the media element", + "maxLength": 65535, + "format": "uri" + }, + "textTracks": { + "type": [ + "array", + "null" + ], + "description": "An array of TextTrack objects on the media element", + "items": { + "type": "object", + "description": "A Text Track object", + "properties": { + "kind": { + "type": "string", + "description": "The kind of text track this object represents", + "enum": [ + "subtitles", + "captions", + "descriptions", + "chapters", + "metadata" + ] + }, + "label": { + "type": "string", + "description": "The given label for the text track", + "maxLength": 65535 + }, + "language": { + "type": "string", + "description": "The locale of the text track, matching BCP-47 (https://www.rfc-editor.org/info/bcp47)", + "maxLength": 35 + }, + "mode": { + "type": "string", + "description": "The mode the text track is in", + "enum": [ + "disabled", + "hidden", + "showing" + ] + } + } + } + } + }, + "required": [ + "autoPlay", + "buffered", + "controls", + "currentSrc", + "defaultMuted", + "defaultPlaybackRate", + "error", + "htmlId", + "mediaType", + "networkState", + "preload", + "readyState", + "seekable", + "seeking" + ], + "additionalProperties": false +} diff --git a/schemas/org.whatwg/video_element/jsonschema/1-0-0 b/schemas/org.whatwg/video_element/jsonschema/1-0-0 new file mode 100644 index 00000000..ab5b6e10 --- /dev/null +++ b/schemas/org.whatwg/video_element/jsonschema/1-0-0 @@ -0,0 +1,52 @@ +{ + "$schema": "http://iglucentral.com/schemas/com.snowplowanalytics.self-desc/schema/jsonschema/1-0-0#", + "description": "Context Schema for a video player event", + "self": { + "vendor": "org.whatwg", + "name": "video_element", + "format": "jsonschema", + "version": "1-0-0" + }, + "type": "object", + "properties": { + "autoPictureInPicture": { + "type": [ + "boolean", + "null" + ], + "description": "A boolean value that is true if the video should enter or leave picture-in-picture mode automatically when changing tab and/or application" + }, + "disablePictureInPicture": { + "type": [ + "boolean", + "null" + ], + "description": "The disablePictureInPicture property will hint the user agent to not suggest the picture-in-picture to users or to request it automatically" + }, + "poster": { + "type": [ + "string", + "null" + ], + "description": "'poster' HTML attribute, which specifies an image to show while no video data is available", + "maxLength": 65535 + }, + "videoHeight": { + "type": "integer", + "description": "A value indicating the intrinsic height of the resource in CSS pixels, or 0 if no media is available yet", + "minimum": 0, + "maximum": 65535 + }, + "videoWidth": { + "type": "integer", + "description": "A value indicating the intrinsic width of the resource in CSS pixels, or 0 if no media is available yet", + "minimum": 0, + "maximum": 65535 + } + }, + "additionalProperties": false, + "required": [ + "videoHeight", + "videoWidth" + ] +}