glam/schemas/20251121/linkml/modules/classes/VideoPost.yaml
kempersc fc405445c6 Refactor and update schema definitions
- Removed obsolete slots: `has_or_had_custodian_observation`, `provider`, and `specificity_annotation`.
- Updated `has_or_had_score` slot to use `SpecificityScore` class and modified its description and examples.
- Added new slots: `end_seconds`, `end_time`, `has_archive_path`, `has_or_had_custodian_name`, `protocol_name`, and `protocol_version`.
- Introduced a script `check_annotation_types.py` to validate the presence and structure of `custodian_types` in YAML files.
- Added a script `update_specificity.py` to automate updates related to `SpecificityAnnotation` to `SpecificityScore`.
2026-02-01 19:55:38 +01:00

380 lines
No EOL
13 KiB
YAML

id: https://nde.nl/ontology/hc/class/VideoPost
name: video_post_class
title: Video Post Class
imports:
- linkml:types
- ../slots/has_or_had_author
- ../slots/has_or_had_caption
- ../slots/has_or_had_comment
- ../slots/has_or_had_comment # was: video_comment
- ../slots/has_or_had_content
- ../slots/has_or_had_degree
- ../slots/has_or_had_identifier
- ../slots/has_or_had_language
- ../slots/has_or_had_quantity
- ../slots/has_or_had_reply
- ../slots/has_or_had_resolution
- ../slots/has_or_had_score
- ../slots/has_or_had_score # was: template_specificity
- ../slots/has_or_had_status
- ../slots/has_or_had_time_interval
- ../slots/is_embeddable
- ../slots/is_licensed_content
- ../slots/is_made_for_kid
- ../slots/is_or_was_appreciated
- ../slots/is_or_was_dismissed
- ../slots/is_or_was_last_updated_at
- ../slots/is_or_was_part_of_total
- ../slots/language
- ../slots/like_count
- ../slots/live_broadcast_content
- ../slots/metrics_observed_at
- ../slots/temporal_extent
- ../enums/LiveBroadcastStatusEnum
default_prefix: hc
classes:
VideoPost:
is_a: SocialMediaPost
class_uri: schema:VideoObject
description: "A video post on a social media platform (e.g. YouTube).\n\nExtends SocialMediaPost with video-specific properties like duration,\nresolution, caption availability, and view counts.\n"
exact_mappings:
- schema:VideoObject
- as:Video
slots:
- has_or_had_caption
- is_or_was_part_of_total
- has_or_had_language
- has_or_had_status
- has_or_had_resolution
- is_or_was_dismissed
- has_or_had_time_interval
- is_embeddable
- is_licensed_content
- is_made_for_kid
- like_count
- live_broadcast_content
- metrics_observed_at
- has_or_had_score
- has_or_had_identifier
- has_or_had_comment
- has_or_had_quantity
slot_usage:
has_or_had_time_interval:
range: TimeInterval
required: false
inlined: true
examples:
- value:
- value:
# MIGRATED 2026-01-24: definition → has_or_had_resolution + Resolution (Rule 53)
has_or_had_resolution:
range: Resolution
required: false
inlined: true
examples:
- value:
resolution_class: hd
aspect_ratio: "16:9"
- value:
resolution_class: "4k"
- value:
resolution_class: sd
has_or_had_degree:
range: AspectRatio
inlined: true
required: false
examples:
- value:
has_or_had_degree: '16:9'
- value:
has_or_had_degree: '9:16'
# MIGRATED 2026-01-22: frame_rate → has_or_had_quantity + Quantity + has_or_had_unit + Unit (Rule 53)
# frame_rate:
# range: float
# required: false
# examples:
# - value: 30.0
# description: 30 frames per second
# MIGRATED 2026-01-22: caption_available → has_or_had_caption + Caption per slot_fixes.yaml feedback
has_or_had_caption:
range: Caption
multivalued: true
inlined: true
required: false
examples:
- value:
language: en
- value:
language: nl
caption_url: https://example.org/video/captions_nl.vtt
- value:
language: null
# MIGRATED 2026-01-23: default_language, default_audio_language → has_or_had_language + Language + has_or_had_status + Status (Rule 53)
has_or_had_language:
range: Language
inlined: true
multivalued: true
required: false
examples:
- value:
language_code: "nl"
language_name: "Dutch"
- value:
language_code: "nl"
language_name: "Dutch"
- value:
language_code: "en"
language_name: "English"
has_or_had_status:
range: Status
inlined: true
multivalued: true
required: false
examples:
- value:
status_value: "nl"
- value:
status_value: "nl"
# has_available_caption_language REMOVED - migrated to has_or_had_language (Rule 53)
# has_available_caption_language:
# range: string
# multivalued: true
# required: false
# examples:
# - value:
# - nl
# - en
# - de
# description: Captions available in Dutch, English, German
has_or_had_quantity:
range: integer
inlined: true
multivalued: true
examples:
- value:
has_or_had_measurement_unit:
has_or_had_type: VIEW
temporal_extent:
begin_of_the_begin: "2025-12-01T23:16:22Z"
- value:
has_or_had_measurement_unit:
has_or_had_type: COMMENT
temporal_extent:
begin_of_the_begin: "2025-12-01T23:16:22Z"
- value:
has_or_had_unit:
unit_uri: "qudt:FPS"
- value:
has_or_had_unit:
has_or_had_label:
- label_text: "frames per second"
like_count:
range: integer
required: false
minimum_value: 0
examples:
- value: 2
is_or_was_dismissed:
range: DismissalEvent
required: false
multivalued: true
inlined: true
examples:
- value:
has_or_had_quantity:
has_or_had_unit:
has_or_had_label: "dislike"
# REMOVED 2026-01-18: comment_count - migrated to has_or_had_quantity + Quantity (Rule 53)
# comment_count:
# range: integer
# required: false
# minimum_value: 0
# examples:
# - value: 0
# description: No comments at observation time
# MIGRATED 2026-01-26: favorite_count → has_or_had_quantity + Quantity (Rule 53)
# favorite_count:
# range: integer
# required: false
# minimum_value: 0
metrics_observed_at:
range: datetime
required: false
examples:
- value: '2025-12-01T23:16:22.294232+00:00'
# MIGRATED from video_category_id (2026-01-14, Rule 53)
# video_category_id:
# range: string
# required: false
# examples:
# - value: '22'
# description: 'YouTube: People & Blogs'
# - value: '27'
# description: 'YouTube: Education'
has_or_had_identifier:
range: VideoCategoryIdentifier
multivalued: true
required: false
inlined: true
examples:
- value: '{"has_or_had_code": "27", "category_name": "Education", "platform": "YouTube"}'
description: 'YouTube: Education category'
live_broadcast_content:
range: LiveBroadcastStatusEnum
required: false
examples:
- value: none
- value: live
is_licensed_content:
range: boolean
required: false
is_embeddable:
range: boolean
required: false
is_made_for_kid:
range: boolean
required: false
# MIGRATED 2026-01-22: comments_fetched → is_or_was_retrieved_at + is_or_was_part_of_total + SourceCommentCount (Rule 53)
# comments_fetched:
# range: integer
# required: false
# minimum_value: 0
# examples:
# - value: 0
# description: No comments fetched
inlined: true
examples:
- value:
has_or_had_timestamp: "2025-12-01T23:16:22Z"
is_or_was_part_of_total:
range: SourceCommentCount
inlined: true
required: false
examples:
- value:
- value:
has_or_had_comment: # was: video_comment - migrated per Rule 53 (2025-01-15)
range: VideoComment
multivalued: true
required: false
inlined: true
comments:
- Extends SocialMediaPost with video-specific properties
- Maps to as:Video and schema:VideoObject
- Metrics are observational - always include metrics_observed_at
- Caption availability signals but not content (see VideoSubtitle)
- YouTube is primary platform for heritage institution video content
see_also:
- https://www.w3.org/ns/activitystreams#Video
- https://schema.org/VideoObject
- https://developers.google.com/youtube/v3/docs/videos
VideoComment:
class_uri: schema:Comment
description: 'A comment on a video post.
Models user-generated comments with author, text, timestamp,
and engagement metrics. Supports nested reply threads.
'
exact_mappings:
- schema:Comment
- as:Note
slots:
# MIGRATED 2026-01-18: comment_author → has_or_had_author + Author (Rule 53)
- has_or_had_author
# MIGRATED 2026-01-22: comment_author_channel_id → has_or_had_identifier + DigitalPlatformUserIdentifier (Rule 53)
# NOTE: has_or_had_identifier already present - used for both comment_id and comment_author_channel_id
# REMOVED 2026-01-18: comment_id - migrated to has_or_had_identifier + Identifier (Rule 53)
- has_or_had_identifier
# MIGRATED 2026-01-22: comment_like_count → is_or_was_appreciated + AppreciationEvent (Rule 53)
- is_or_was_appreciated
# REMOVED 2026-01-18: comment_published_at - migrated to temporal_extent + TimeSpan (Rule 53)
- temporal_extent
# MIGRATED 2026-01-22: comment_reply_count → has_or_had_reply + CommentReply (Rule 53)
- has_or_had_reply
# REMOVED 2026-01-18: comment_text - migrated to has_or_had_content + Content (Rule 53)
- has_or_had_content
# REMOVED 2026-01-18: comment_updated_at - migrated to was_last_updated_at + Timestamp (Rule 53)
- is_or_was_last_updated_at
- has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
slot_usage:
# MIGRATED 2026-01-18: comment_id → has_or_had_identifier + Identifier (Rule 53/56)
has_or_had_identifier:
range: uriorcurie
inlined: true
required: true
examples:
- value:
# REMOVED 2026-01-18: comment_author - migrated to has_or_had_author + Author (Rule 53)
# MIGRATED 2026-01-18: comment_author → has_or_had_author + Author (Rule 53)
# MIGRATED 2026-01-22: comment_author_channel_id is now captured via Author.has_or_had_identifier (Rule 53)
has_or_had_author:
range: Author
inlined: true
required: true
examples:
- value:
has_or_had_name: "Visitor123"
- value:
has_or_had_name: "MuseumFan2024"
has_or_had_identifier:
- identifier_scheme: youtube_channel_id
platform_type: "youtube"
# MIGRATED 2026-01-22: comment_author_channel_id → has_or_had_identifier + DigitalPlatformUserIdentifier (Rule 53)
# NOTE: has_or_had_identifier slot_usage updated above to handle BOTH comment_id AND comment_author_channel_id
# The Author class already has has_or_had_identifier slot, so channel_id can be linked via:
# has_or_had_author:
# has_or_had_identifier:
# - identifier_scheme: youtube_channel_id
# identifier_value: "UC1234..."
# platform_type: "youtube"
# MIGRATED 2026-01-18: comment_text → has_or_had_content + Content (Rule 53/56)
has_or_had_content:
range: string
inlined: true
required: true
examples:
- value:
has_or_had_description: "Great video about the collection!"
# MIGRATED 2026-01-18: comment_published_at → temporal_extent + TimeSpan (Rule 53/56)
temporal_extent:
range: TimeSpan
inlined: true
required: true
examples:
- value:
begin_of_the_begin: "2025-01-14T10:30:00Z"
# MIGRATED 2026-01-18: comment_updated_at → was_last_updated_at + Timestamp (Rule 53/56)
is_or_was_last_updated_at:
range: Timestamp
inlined: true
required: false
examples:
- value:
has_or_had_timestamp: "2025-01-15T10:30:00Z"
has_or_had_level: second
# MIGRATED 2026-01-22: comment_like_count → is_or_was_appreciated + AppreciationEvent (Rule 53)
is_or_was_appreciated:
range: AppreciationEvent
inlined: true
inlined_as_list: true
required: false
examples:
- value:
- value:
has_or_had_quantity:
numeric_value: 100
has_or_had_unit:
unit_label: "likes"
# MIGRATED 2026-01-22: comment_reply_count → has_or_had_reply + CommentReply (Rule 53)
has_or_had_reply:
range: CommentReply
inlined: true
inlined_as_list: true
required: false
examples:
- value:
- value:
- value:
has_or_had_quantity:
numeric_value: 12
has_or_had_unit:
unit_label: "replies"