All checks were successful
Deploy Frontend / build-and-deploy (push) Successful in 2m4s
Session 2026-01-19: Completed remaining migrations per Rules 53/56/60. Major migrations: 1. claim_type → has_or_had_type + ClaimType/ClaimTypes (60+ concrete types in 11 categories) 2. circumstances_of_death → is_deceased + DeceasedStatus + CauseOfDeath 3. claims_count → has_or_had_quantity + Quantity (with based_on_claim for provenance) 4. classification_status → has_or_had_type + ClassificationStatusType Created files: - ClaimType.yaml, ClaimTypes.yaml (abstract base + 60+ concrete subclasses) - DeceasedStatus.yaml, CauseOfDeath.yaml, CauseOfDeathTypeEnum.yaml - ClassificationStatus.yaml, ClassificationStatusType.yaml, ClassificationStatusTypes.yaml - CITESAppendix.yaml, City.yaml, CertaintyLevel.yaml - is_deceased.yaml, is_or_was_caused_by.yaml, based_on_claim.yaml Archived slots: - claim_type, circumstances_of_death, claims_count, classification_status Added Rule 60 to AGENTS.md: No Migration Deferral - agents MUST execute all migrations. All 527 slot_fixes.yaml entries now complete (100%).
537 lines
17 KiB
YAML
537 lines
17 KiB
YAML
id: https://nde.nl/ontology/hc/class/VideoPost
|
|
name: video_post_class
|
|
title: Video Post Class
|
|
imports:
|
|
- linkml:types
|
|
- ./SocialMediaPost
|
|
- ./SocialMediaPostTypes
|
|
- ../slots/language
|
|
- ../slots/has_aspect_ratio
|
|
# REMOVED 2026-01-15: ../slots/available_caption_languages - migrated to has_available_caption_language
|
|
- ../slots/caption_available
|
|
# REMOVED 2026-01-18: ../slots/comment_author - migrated to has_or_had_author + Author (Rule 53)
|
|
- ../slots/has_or_had_author
|
|
- ./Author
|
|
- ../slots/comment_author_channel_id
|
|
# REMOVED 2026-01-18: ../slots/comment_id - migrated to has_or_had_identifier + Identifier (Rule 53)
|
|
# REMOVED 2026-01-18: ../slots/comment_count - migrated to has_or_had_quantity + Quantity (Rule 53)
|
|
- ../slots/comment_like_count
|
|
# REMOVED 2026-01-18: ../slots/comment_published_at - migrated to temporal_extent + TimeSpan (Rule 53)
|
|
- ../slots/temporal_extent
|
|
- ./TimeSpan
|
|
- ../slots/has_or_had_comment_reply
|
|
- ../slots/comment_reply_count
|
|
# REMOVED 2026-01-18: ../slots/comment_text - migrated to has_or_had_content + Content (Rule 53)
|
|
- ../slots/has_or_had_content
|
|
- ./Content
|
|
# REMOVED 2026-01-18: ../slots/comment_updated_at - migrated to was_last_updated_at + Timestamp (Rule 53)
|
|
- ../slots/was_last_updated_at
|
|
- ./Timestamp
|
|
- ../slots/comments_fetched
|
|
- ../slots/default_audio_language
|
|
- ../slots/default_language
|
|
- ../slots/dislike_count
|
|
- ../slots/duration
|
|
- ../slots/favorite_count
|
|
- ../slots/frame_rate
|
|
- ../slots/is_embeddable
|
|
- ../slots/is_licensed_content
|
|
- ../slots/is_made_for_kid
|
|
- ../slots/like_count
|
|
- ../slots/live_broadcast_content
|
|
- ../slots/metrics_observed_at
|
|
- ../slots/specificity_annotation
|
|
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
|
|
# REMOVED - migrated to has_or_had_identifier with VideoCategoryIdentifier (2026-01-14, Rule 53)
|
|
# - ../slots/video_category_id
|
|
- ../slots/has_or_had_identifier
|
|
- ./Identifier
|
|
- ./VideoCategoryIdentifier
|
|
# REMOVED 2026-01-18: ../slots/comment_id - migrated to has_or_had_identifier + Identifier (Rule 53)
|
|
- ../slots/has_or_had_comment # was: video_comment - migrated per Rule 53 (2025-01-15)
|
|
- ../slots/has_or_had_quantity
|
|
- ./Quantity
|
|
# MIGRATED 2026-01-15: ../slots/view_count → ../slots/has_or_had_quantity per Rule 53
|
|
- ./SpecificityAnnotation
|
|
- ./TemplateSpecificityScore # was: TemplateSpecificityScores - migrated per Rule 53 (2026-01-17)
|
|
|
|
- ./TemplateSpecificityType
|
|
|
|
- ./TemplateSpecificityTypes
|
|
- ../slots/definition
|
|
- ../slots/has_available_caption_language
|
|
- ../enums/VideoDefinitionEnum
|
|
- ../enums/LiveBroadcastStatusEnum
|
|
prefixes:
|
|
linkml: https://w3id.org/linkml/
|
|
hc: https://nde.nl/ontology/hc/
|
|
schema: http://schema.org/
|
|
dcterms: http://purl.org/dc/terms/
|
|
prov: http://www.w3.org/ns/prov#
|
|
crm: http://www.cidoc-crm.org/cidoc-crm/
|
|
skos: http://www.w3.org/2004/02/skos/core#
|
|
as: https://www.w3.org/ns/activitystreams#
|
|
wd: http://www.wikidata.org/entity/
|
|
default_prefix: hc
|
|
classes:
|
|
VideoPost:
|
|
is_a: SocialMediaPost
|
|
class_uri: as:Video
|
|
abstract: false
|
|
description: 'Concrete class for video content with platform-specific properties.
|
|
|
|
|
|
**DEFINITION**:
|
|
|
|
|
|
VideoPost is a specialized SocialMediaPost for video content. It extends
|
|
|
|
the base post class with video-specific slots for duration, resolution,
|
|
|
|
captions, and engagement metrics.
|
|
|
|
|
|
**EXTENDS**: SocialMediaPost
|
|
|
|
|
|
This class adds:
|
|
|
|
- Video technical properties (duration, definition, aspect ratio)
|
|
|
|
- Caption and subtitle availability
|
|
|
|
- Engagement metrics (views, likes, comments)
|
|
|
|
- Platform-specific fields (YouTube category, live broadcast status)
|
|
|
|
- Temporal markers (chapters, segments)
|
|
|
|
|
|
**ONTOLOGY MAPPINGS**:
|
|
|
|
|
|
| Property | Activity Streams | Schema.org |
|
|
|
|
|----------|------------------|------------|
|
|
|
|
| Class | as:Video | schema:VideoObject |
|
|
|
|
| duration | as:duration | schema:duration |
|
|
|
|
| definition | - | schema:videoQuality |
|
|
|
|
| caption | - | schema:caption |
|
|
|
|
| view_count | - | schema:interactionStatistic (via Quantity) |
|
|
|
|
|
|
**PLATFORM SUPPORT**:
|
|
|
|
|
|
| Platform | Duration Limit | Resolution | Captions |
|
|
|
|
|----------|----------------|------------|----------|
|
|
|
|
| YouTube | 12 hours (verified) | Up to 8K | VTT, SRT |
|
|
|
|
| Vimeo | Varies by plan | Up to 8K | VTT, SRT |
|
|
|
|
| Facebook | 4 hours | Up to 4K | Auto-generated |
|
|
|
|
| TikTok | 10 minutes | 1080p | Auto-generated |
|
|
|
|
| Instagram Reels | 90 seconds | 1080p | Auto-generated |
|
|
|
|
|
|
**HERITAGE INSTITUTION USE CASES**:
|
|
|
|
|
|
| Content Type | Typical Duration | Platform |
|
|
|
|
|--------------|------------------|----------|
|
|
|
|
| Virtual tours | 10-30 min | YouTube |
|
|
|
|
| Conservation docs | 5-20 min | YouTube, Vimeo |
|
|
|
|
| Curator interviews | 15-60 min | YouTube |
|
|
|
|
| Object spotlights | 2-5 min | YouTube, Instagram |
|
|
|
|
| Short clips | 15-60 sec | TikTok, Reels |
|
|
|
|
| Live recordings | 30-120 min | YouTube |
|
|
|
|
|
|
**METRICS OBSERVATION**:
|
|
|
|
|
|
Video metrics (views, likes, comments) are observational data that change
|
|
|
|
constantly. Each metric reading should include:
|
|
|
|
- `metrics_observed_at`: When metrics were recorded
|
|
|
|
- `retrieval_timestamp`: When API call was made
|
|
|
|
|
|
**RELATIONSHIP TO VideoPostType**:
|
|
|
|
|
|
- VideoPost is a **concrete post instance** with video content
|
|
|
|
- VideoPostType is a **type classification** for categorizing posts
|
|
|
|
- A VideoPost typically has `post_types: [VideoPostType]`
|
|
|
|
- But may also have multiple types: `[LiveStreamPostType, VideoPostType]`
|
|
|
|
|
|
**CAPTION AND SUBTITLE DISTINCTION**:
|
|
|
|
|
|
Related classes for textual content derived from video:
|
|
|
|
- VideoSubtitle: Time-coded text (SRT/VTT format)
|
|
|
|
- VideoTranscript: Full text without timestamps
|
|
|
|
- VideoAnnotation: Computer vision derived content
|
|
|
|
|
|
See VideoTextContent hierarchy for detailed modeling.
|
|
|
|
'
|
|
exact_mappings:
|
|
- as:Video
|
|
- schema:VideoObject
|
|
close_mappings:
|
|
- crm:E73_Information_Object
|
|
related_mappings:
|
|
- wikidata:Q34508
|
|
- wikidata:Q604644
|
|
slots:
|
|
- has_aspect_ratio
|
|
- has_available_caption_language
|
|
- caption_available
|
|
# REMOVED 2026-01-18: comment_count - migrated to has_or_had_quantity + Quantity (Rule 53)
|
|
- comments_fetched
|
|
- default_audio_language
|
|
- default_language
|
|
- definition
|
|
- dislike_count
|
|
- duration
|
|
- favorite_count
|
|
- frame_rate
|
|
- is_embeddable
|
|
- is_licensed_content
|
|
- is_made_for_kid
|
|
- like_count
|
|
- live_broadcast_content
|
|
- metrics_observed_at
|
|
- specificity_annotation
|
|
- has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
|
|
# REMOVED - migrated to has_or_had_identifier (2026-01-14, Rule 53)
|
|
# - video_category_id
|
|
- has_or_had_identifier
|
|
- has_or_had_comment # was: video_comment - migrated per Rule 53 (2025-01-15)
|
|
- has_or_had_quantity
|
|
slot_usage:
|
|
duration:
|
|
range: string
|
|
required: false
|
|
pattern: ^P(T(\d+H)?(\d+M)?(\d+S)?)?$
|
|
examples:
|
|
- value: PT10M59S
|
|
description: 10 minutes and 59 seconds
|
|
- value: PT1H30M
|
|
description: 1 hour 30 minutes
|
|
definition:
|
|
range: VideoDefinitionEnum
|
|
required: false
|
|
examples:
|
|
- value: hd
|
|
description: High definition (720p/1080p)
|
|
has_aspect_ratio:
|
|
range: string
|
|
required: false
|
|
examples:
|
|
- value: '16:9'
|
|
description: Standard widescreen
|
|
- value: '9:16'
|
|
description: Vertical format for Shorts/Reels
|
|
frame_rate:
|
|
range: float
|
|
required: false
|
|
examples:
|
|
- value: 30.0
|
|
description: 30 frames per second
|
|
caption_available:
|
|
range: boolean
|
|
required: false
|
|
examples:
|
|
- value: true
|
|
description: Video has captions available
|
|
- value: false
|
|
description: No captions available
|
|
default_language:
|
|
range: string
|
|
required: false
|
|
examples:
|
|
- value: nl
|
|
description: Dutch language content
|
|
default_audio_language:
|
|
range: string
|
|
required: false
|
|
examples:
|
|
- value: nl
|
|
description: Dutch audio track
|
|
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: Quantity
|
|
inlined: true
|
|
multivalued: true
|
|
description: |
|
|
Quantified metrics for video content. RULE 53: Replaces deprecated
|
|
view_count and comment_count with structured Quantity class supporting
|
|
measurement unit and temporal extent for point-in-time observation.
|
|
|
|
MIGRATED SLOTS:
|
|
- view_count → Quantity with has_or_had_measurement_unit: VIEW (2026-01-15)
|
|
- comment_count → Quantity with has_or_had_measurement_unit: COMMENT (2026-01-18)
|
|
examples:
|
|
- value:
|
|
quantity_value: 132
|
|
quantity_type: VIEW_COUNT
|
|
has_or_had_measurement_unit:
|
|
has_or_had_type: VIEW
|
|
temporal_extent:
|
|
begin_of_the_begin: "2025-12-01T23:16:22Z"
|
|
description: 132 views at observation time
|
|
- value:
|
|
quantity_value: 42
|
|
quantity_type: ENGAGEMENT_COUNT
|
|
has_or_had_measurement_unit:
|
|
has_or_had_type: COMMENT
|
|
temporal_extent:
|
|
begin_of_the_begin: "2025-12-01T23:16:22Z"
|
|
description: 42 comments at observation time (migrated from comment_count)
|
|
like_count:
|
|
range: integer
|
|
required: false
|
|
minimum_value: 0
|
|
examples:
|
|
- value: 2
|
|
description: 2 likes at observation time
|
|
dislike_count:
|
|
range: integer
|
|
required: false
|
|
minimum_value: 0
|
|
# 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
|
|
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'
|
|
description: Metrics observed December 1, 2025
|
|
# 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:
|
|
description: Video category identifier (migrated from video_category_id)
|
|
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
|
|
description: Standard video (not live)
|
|
- value: live
|
|
description: Currently broadcasting
|
|
is_licensed_content:
|
|
range: boolean
|
|
required: false
|
|
is_embeddable:
|
|
range: boolean
|
|
required: false
|
|
is_made_for_kid:
|
|
range: boolean
|
|
required: false
|
|
comments_fetched:
|
|
range: integer
|
|
required: false
|
|
minimum_value: 0
|
|
examples:
|
|
- value: 0
|
|
description: No comments fetched
|
|
has_or_had_comment: # was: video_comment - migrated per Rule 53 (2025-01-15)
|
|
range: VideoComment
|
|
multivalued: true
|
|
required: false
|
|
inlined: true
|
|
description: |
|
|
Comments on this video post.
|
|
MIGRATED from video_comment slot per slot_fixes.yaml (Rule 53, 2025-01-15).
|
|
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
|
|
- comment_author_channel_id
|
|
# REMOVED 2026-01-18: comment_id - migrated to has_or_had_identifier + Identifier (Rule 53)
|
|
- has_or_had_identifier
|
|
- comment_like_count
|
|
# REMOVED 2026-01-18: comment_published_at - migrated to temporal_extent + TimeSpan (Rule 53)
|
|
- temporal_extent
|
|
- has_or_had_comment_reply
|
|
- comment_reply_count
|
|
# 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)
|
|
- was_last_updated_at
|
|
- specificity_annotation
|
|
- 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:
|
|
description: |
|
|
MIGRATED from comment_id per slot_fixes.yaml (Rule 53/56, 2026-01-18).
|
|
Unique identifier for the comment (YouTube comment ID).
|
|
Uses Identifier class for structured identifier representation.
|
|
range: Identifier
|
|
inlined: true
|
|
required: true
|
|
examples:
|
|
- value:
|
|
identifier_scheme: youtube_comment_id
|
|
identifier_value: "UgzK1234abcdefgh"
|
|
description: YouTube comment identifier
|
|
comment_author:
|
|
range: string
|
|
required: true
|
|
# MIGRATED 2026-01-18: comment_author → has_or_had_author + Author (Rule 53)
|
|
has_or_had_author:
|
|
description: |
|
|
MIGRATED from comment_author per slot_fixes.yaml (Rule 53, 2026-01-18).
|
|
Display name of comment author.
|
|
Uses Author class for structured author representation.
|
|
range: Author
|
|
inlined: true
|
|
required: true
|
|
examples:
|
|
- value:
|
|
has_or_had_name: "Visitor123"
|
|
description: Comment author display name
|
|
- value:
|
|
has_or_had_name: "MuseumFan2024"
|
|
has_or_had_identifier: "https://youtube.com/channel/UC123"
|
|
description: Comment author with channel link
|
|
comment_author_channel_id:
|
|
range: string
|
|
required: false
|
|
# MIGRATED 2026-01-18: comment_text → has_or_had_content + Content (Rule 53/56)
|
|
has_or_had_content:
|
|
description: |
|
|
MIGRATED from comment_text per slot_fixes.yaml (Rule 53/56, 2026-01-18).
|
|
Full text content of the comment.
|
|
Uses Content class with has_or_had_description for the actual text.
|
|
range: Content
|
|
inlined: true
|
|
required: true
|
|
examples:
|
|
- value:
|
|
has_or_had_description: "Great video about the collection!"
|
|
description: Comment content using Content class
|
|
# MIGRATED 2026-01-18: comment_published_at → temporal_extent + TimeSpan (Rule 53/56)
|
|
temporal_extent:
|
|
description: |
|
|
MIGRATED from comment_published_at per slot_fixes.yaml (Rule 53/56, 2026-01-18).
|
|
When comment was originally posted.
|
|
Uses TimeSpan class for structured temporal representation.
|
|
range: TimeSpan
|
|
inlined: true
|
|
required: true
|
|
examples:
|
|
- value:
|
|
begin_of_the_begin: "2025-01-14T10:30:00Z"
|
|
description: Comment published timestamp
|
|
# MIGRATED 2026-01-18: comment_updated_at → was_last_updated_at + Timestamp (Rule 53/56)
|
|
was_last_updated_at:
|
|
description: |
|
|
MIGRATED from comment_updated_at per slot_fixes.yaml (Rule 53/56, 2026-01-18).
|
|
When comment was last edited.
|
|
Uses Timestamp class for structured temporal representation.
|
|
range: Timestamp
|
|
inlined: true
|
|
required: false
|
|
examples:
|
|
- value:
|
|
has_or_had_timestamp: "2025-01-15T10:30:00Z"
|
|
has_or_had_precision: second
|
|
description: Comment last updated timestamp
|
|
comment_like_count:
|
|
range: integer
|
|
required: false
|
|
minimum_value: 0
|
|
comment_reply_count:
|
|
range: integer
|
|
required: false
|
|
minimum_value: 0
|
|
has_or_had_comment_reply:
|
|
range: VideoComment
|
|
multivalued: true
|
|
required: false
|
|
inlined: true
|