id: https://nde.nl/ontology/hc/class/VideoPost name: video_post_class title: Video Post Class imports: - linkml:types - ../slots/has_author - ../slots/has_caption - ../slots/commented_on - ../slots/has_content - ../slots/has_degree - ../slots/identified_by - ../slots/has_language - ../slots/has_quantity - ../slots/has_reply - ../slots/has_resolution - ../slots/has_score - ../slots/has_status - ../slots/has_time_interval - ../slots/embedded_on - ../slots/licensed_as - ../slots/appropriate_for - ../slots/appreciated - ../slots/dismissed - ../slots/updated_at - ../slots/part_of - ../slots/in_language - ../slots/broadcast - ../slots/observed_through - ../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_caption - part_of - has_language - has_status - has_resolution - dismissed - has_time_interval - embedded_on - licensed_as - appropriate_for - has_quantity - broadcast - observed_through - has_score - identified_by - commented_on - has_quantity slot_usage: has_time_interval: range: TimeInterval required: false inlined: true examples: - value: - value: # MIGRATED 2026-01-24: definition → has_resolution + Resolution (Rule 53) has_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_degree: range: AspectRatio inlined: true required: false examples: - value: has_degree: '16:9' - value: has_degree: '9:16' # MIGRATED 2026-01-22: frame_rate → has_quantity + Quantity + has_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_caption + Caption per slot_fixes.yaml feedback has_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_language + Language + has_status + Status (Rule 53) has_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_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_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_quantity: range: integer inlined: false # Fixed invalid inline for primitive type multivalued: true examples: - value: has_measurement_unit: has_type: VIEW temporal_extent: begin_of_the_begin: "2025-12-01T23:16:22Z" - value: has_measurement_unit: has_type: COMMENT temporal_extent: begin_of_the_begin: "2025-12-01T23:16:22Z" - value: has_measurement_unit: unit_uri: "qudt:FPS" - value: has_measurement_unit: has_label: - label_text: "frames per second" has_quantity: range: integer required: false minimum_value: 0 examples: - value: 2 dismissed: range: DismissalEvent required: false multivalued: true inlined: true examples: - value: has_quantity: has_measurement_unit: has_label: "dislike" # REMOVED 2026-01-18: comment_count - migrated to has_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_quantity + Quantity (Rule 53) # favorite_count: # range: integer # required: false # minimum_value: 0 observed_through: 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' identified_by: range: VideoCategoryIdentifier multivalued: true required: false inlined: true examples: - value: '{"has_code": "27", "category_name": "Education", "platform": "YouTube"}' description: 'YouTube: Education category' broadcast: range: LiveBroadcastStatusEnum required: false examples: - value: none - value: live licensed_as: range: boolean required: false embedded_on: range: boolean required: false appropriate_for: range: boolean required: false # MIGRATED 2026-01-22: comments_fetched → retrieved_at + part_of_total + SourceCommentCount (Rule 53) # comments_fetched: # range: integer # required: false # minimum_value: 0 # examples: # - value: 0 # description: No comments fetched inlined: false # Fixed invalid inline for primitive type examples: - value: has_timestamp: "2025-12-01T23:16:22Z" part_of: range: SourceCommentCount inlined: true required: false examples: - value: - value: commented_on: # 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_author + Author (Rule 53) - has_author # MIGRATED 2026-01-22: comment_author_channel_id → identified_by + DigitalPlatformUserIdentifier (Rule 53) # NOTE: identified_by already present - used for both comment_id and comment_author_channel_id # REMOVED 2026-01-18: comment_id - migrated to identified_by + Identifier (Rule 53) - identified_by # MIGRATED 2026-01-22: comment_like_count → appreciated + AppreciationEvent (Rule 53) - 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_reply + CommentReply (Rule 53) - has_reply # REMOVED 2026-01-18: comment_text - migrated to has_content + Content (Rule 53) - has_content # REMOVED 2026-01-18: comment_updated_at - migrated to was_last_updated_at + Timestamp (Rule 53) - updated_at - has_score # was: template_specificity - migrated per Rule 53 (2026-01-17) slot_usage: # MIGRATED 2026-01-18: comment_id → identified_by + Identifier (Rule 53/56) identified_by: # range: string # uriorcurie inlined: false # Fixed invalid inline for primitive type required: true examples: - value: # REMOVED 2026-01-18: comment_author - migrated to has_author + Author (Rule 53) # MIGRATED 2026-01-18: comment_author → has_author + Author (Rule 53) # MIGRATED 2026-01-22: comment_author_channel_id is now captured via Author.identified_by (Rule 53) has_author: range: Author inlined: true required: true examples: - value: has_name: "Visitor123" - value: has_name: "MuseumFan2024" identified_by: - identifier_scheme: youtube_channel_id platform_type: "youtube" # MIGRATED 2026-01-22: comment_author_channel_id → identified_by + DigitalPlatformUserIdentifier (Rule 53) # NOTE: identified_by slot_usage updated above to handle BOTH comment_id AND comment_author_channel_id # The Author class already has identified_by slot, so channel_id can be linked via: # has_author: # identified_by: # - identifier_scheme: youtube_channel_id # identifier_value: "UC1234..." # platform_type: "youtube" # MIGRATED 2026-01-18: comment_text → has_content + Content (Rule 53/56) has_content: # range: string inlined: false # Fixed invalid inline for primitive type required: true examples: - value: has_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) updated_at: range: Timestamp inlined: true required: false examples: - value: has_timestamp: "2025-01-15T10:30:00Z" has_level: second # MIGRATED 2026-01-22: comment_like_count → appreciated + AppreciationEvent (Rule 53) appreciated: range: AppreciationEvent inlined: true inlined_as_list: true required: false examples: - value: - value: has_quantity: numeric_value: 100 has_measurement_unit: unit_label: "likes" # MIGRATED 2026-01-22: comment_reply_count → has_reply + CommentReply (Rule 53) has_reply: range: CommentReply inlined: true inlined_as_list: true required: false examples: - value: - value: - value: has_quantity: numeric_value: 12 has_measurement_unit: unit_label: "replies"