feat(schema): Add social media post and content modeling schema
Social Media Post Classes: - SocialMediaPost: Base class for platform-agnostic post modeling - SocialMediaPostType: Abstract base for post type taxonomy - SocialMediaPostTypes: Concrete post types (TextPost, ImagePost, CarouselPost, StoryPost, ReelPost, ArticlePost, PollPost, EventPost) Content Classes: - SocialMediaContent: Rich content modeling with media attachments, hashtags, mentions, links, and engagement metrics Features: - Platform-specific post type mappings (Instagram, LinkedIn, Twitter, etc.) - Engagement analytics (likes, comments, shares, saves) - Heritage institution content categorization - Media attachment handling (images, videos, documents) - Hashtag and mention extraction for heritage topic tracking
This commit is contained in:
parent
767fb8ca80
commit
8a4727eb34
4 changed files with 2280 additions and 0 deletions
450
schemas/20251121/linkml/modules/classes/SocialMediaContent.yaml
Normal file
450
schemas/20251121/linkml/modules/classes/SocialMediaContent.yaml
Normal file
|
|
@ -0,0 +1,450 @@
|
|||
# Social Media Content Base Class
|
||||
# Abstract base class for all social media content items (posts, videos, comments, etc.)
|
||||
#
|
||||
# CONCEPTUAL HIERARCHY:
|
||||
#
|
||||
# SocialMediaPlatformType → SocialMediaProfile → SocialMediaContent
|
||||
# (Platform) (Account/Channel) (Individual Content)
|
||||
#
|
||||
# This class represents CONTENT posted on social media platforms,
|
||||
# distinct from the profile/channel itself (SocialMediaProfile).
|
||||
#
|
||||
# DESIGN RATIONALE:
|
||||
# Heritage custodians post content on social media platforms. This content
|
||||
# (videos, images, text posts) has intrinsic value for documenting:
|
||||
# - Institutional communications
|
||||
# - Collection highlights
|
||||
# - Event recordings
|
||||
# - Educational materials
|
||||
# - Public engagement history
|
||||
#
|
||||
# This abstract base class provides common properties for all content types.
|
||||
|
||||
id: https://nde.nl/ontology/hc/class/SocialMediaContent
|
||||
name: social_media_content_class
|
||||
title: Social Media Content Base Class
|
||||
|
||||
imports:
|
||||
- linkml:types
|
||||
- ./SocialMediaProfile
|
||||
- ./SocialMediaPlatformType
|
||||
- ./TimeSpan
|
||||
- ./WebObservation
|
||||
- ../slots/language
|
||||
|
||||
prefixes:
|
||||
linkml: https://w3id.org/linkml/
|
||||
hc: https://nde.nl/ontology/hc/
|
||||
schema: http://schema.org/
|
||||
foaf: http://xmlns.com/foaf/0.1/
|
||||
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#
|
||||
|
||||
default_prefix: hc
|
||||
|
||||
classes:
|
||||
SocialMediaContent:
|
||||
class_uri: as:Object
|
||||
abstract: true
|
||||
description: |
|
||||
Abstract base class for all social media content items.
|
||||
|
||||
**DEFINITION**:
|
||||
|
||||
SocialMediaContent represents discrete pieces of content published on social media
|
||||
platforms. This includes videos, images, text posts, stories, and other content types.
|
||||
Each content item is posted by a SocialMediaProfile (the channel/account).
|
||||
|
||||
**CRITICAL: CONTENT vs PROFILE vs PLATFORM**:
|
||||
|
||||
| Class | Represents | Example | Cardinality |
|
||||
|-------|------------|---------|-------------|
|
||||
| SocialMediaPlatformType | Platform category | YouTube | ~25 types |
|
||||
| SocialMediaProfile | Account/channel | @rijksmuseum | Thousands |
|
||||
| **SocialMediaContent** | Individual content | A video, post | Millions |
|
||||
|
||||
**ACTIVITY STREAMS 2.0 ALIGNMENT**:
|
||||
|
||||
Maps to `as:Object` from W3C Activity Streams 2.0 vocabulary:
|
||||
- as:Object is the base type for content in social media
|
||||
- Subclasses map to as:Video, as:Image, as:Note, etc.
|
||||
- Enables federation with ActivityPub-based platforms (Mastodon, PeerTube)
|
||||
|
||||
**HERITAGE INSTITUTION CONTEXT**:
|
||||
|
||||
Social media content from heritage institutions includes:
|
||||
|
||||
1. **Official content** (posted by the institution):
|
||||
- Collection highlights
|
||||
- Exhibition announcements
|
||||
- Educational videos
|
||||
- Behind-the-scenes content
|
||||
- Event recordings
|
||||
|
||||
2. **Third-party content** (about the institution):
|
||||
- Visitor videos/photos
|
||||
- News coverage
|
||||
- Academic discussions
|
||||
- Review content
|
||||
|
||||
3. **User-generated content** (mentions):
|
||||
- Tagged posts
|
||||
- Check-ins
|
||||
- Comments/discussions
|
||||
|
||||
**PROVENANCE TRACKING**:
|
||||
|
||||
Content items are OBSERVATIONAL data retrieved via:
|
||||
- Platform APIs (YouTube Data API, Twitter API, etc.)
|
||||
- Web scraping (when API unavailable)
|
||||
- Manual archival
|
||||
|
||||
Each content record includes:
|
||||
- `retrieval_timestamp`: When content was fetched
|
||||
- `api_endpoint`: Which API/method was used
|
||||
- `metrics_observed_date`: When engagement metrics were recorded
|
||||
|
||||
**TEMPORAL CONSIDERATIONS**:
|
||||
|
||||
Content has multiple temporal dimensions:
|
||||
- `published_at`: When originally posted
|
||||
- `updated_at`: Last modification by author
|
||||
- `retrieval_timestamp`: When we fetched it
|
||||
- `metrics_observed_date`: When metrics (views, likes) were recorded
|
||||
|
||||
Engagement metrics change constantly; always record observation timestamp.
|
||||
|
||||
**SUBCLASSES**:
|
||||
|
||||
- VideoPost: YouTube, TikTok, Vimeo videos
|
||||
- ImagePost: Instagram, Pinterest posts (future)
|
||||
- TextPost: Twitter/X, Mastodon posts (future)
|
||||
- StoryPost: Instagram/Facebook stories (future)
|
||||
|
||||
exact_mappings:
|
||||
- as:Object
|
||||
|
||||
close_mappings:
|
||||
- schema:CreativeWork
|
||||
- crm:E73_Information_Object
|
||||
|
||||
related_mappings:
|
||||
- schema:SocialMediaPosting
|
||||
- dcterms:BibliographicResource
|
||||
|
||||
slots:
|
||||
- content_id
|
||||
- content_url
|
||||
- platform_type
|
||||
- posted_by_profile
|
||||
- title
|
||||
- description
|
||||
- published_at
|
||||
- updated_at
|
||||
- language
|
||||
- tags
|
||||
- thumbnail_url
|
||||
- is_official_content
|
||||
- content_category
|
||||
- retrieval_timestamp
|
||||
- api_endpoint
|
||||
- api_version
|
||||
|
||||
slot_usage:
|
||||
content_id:
|
||||
slot_uri: dcterms:identifier
|
||||
description: |
|
||||
Unique identifier for this content item.
|
||||
|
||||
Format varies by platform:
|
||||
- YouTube: Video ID (e.g., "dQw4w9WgXcQ")
|
||||
- Twitter/X: Tweet ID (numeric string)
|
||||
- Instagram: Media ID
|
||||
|
||||
Combined with platform type, this uniquely identifies content globally.
|
||||
range: string
|
||||
required: true
|
||||
identifier: true
|
||||
examples:
|
||||
- value: "FbIoC-Owy-M"
|
||||
description: "YouTube video ID"
|
||||
|
||||
content_url:
|
||||
slot_uri: schema:url
|
||||
description: |
|
||||
Canonical URL to access this content on its native platform.
|
||||
|
||||
URL patterns by platform:
|
||||
- YouTube: https://www.youtube.com/watch?v={video_id}
|
||||
- Twitter/X: https://x.com/{user}/status/{tweet_id}
|
||||
- Instagram: https://www.instagram.com/p/{shortcode}
|
||||
range: uri
|
||||
required: true
|
||||
pattern: "^https?://"
|
||||
examples:
|
||||
- value: "https://www.youtube.com/watch?v=FbIoC-Owy-M"
|
||||
description: "YouTube video URL"
|
||||
|
||||
platform_type:
|
||||
slot_uri: dcterms:type
|
||||
description: |
|
||||
The type of social media platform where this content was posted.
|
||||
|
||||
Uses SocialMediaPlatformType class hierarchy for standardized categorization.
|
||||
range: SocialMediaPlatformType
|
||||
required: true
|
||||
examples:
|
||||
- value: "YouTube"
|
||||
description: "Content from YouTube platform"
|
||||
|
||||
posted_by_profile:
|
||||
slot_uri: as:attributedTo
|
||||
description: |
|
||||
The social media profile (account/channel) that posted this content.
|
||||
|
||||
Activity Streams: attributedTo identifies the actor responsible for the content.
|
||||
|
||||
Links to SocialMediaProfile which in turn links to the Custodian hub.
|
||||
range: SocialMediaProfile
|
||||
required: false
|
||||
examples:
|
||||
- value: "https://nde.nl/ontology/hc/social-media/nationaal-onderduikmuseum-youtube"
|
||||
description: "Museum's YouTube channel profile"
|
||||
|
||||
title:
|
||||
slot_uri: dcterms:title
|
||||
description: |
|
||||
Title or headline of the content.
|
||||
|
||||
Dublin Core: title for the content's name.
|
||||
|
||||
- YouTube videos: Video title
|
||||
- Twitter/X: First line of tweet (or null)
|
||||
- Instagram: Caption beginning
|
||||
range: string
|
||||
required: false
|
||||
examples:
|
||||
- value: "De Vrijheidsroute (aflevering 3) – Zevenaar, Duiven, Westervoort"
|
||||
description: "YouTube video title"
|
||||
|
||||
description:
|
||||
slot_uri: dcterms:description
|
||||
description: |
|
||||
Full description or body text of the content.
|
||||
|
||||
Dublin Core: description for content text.
|
||||
|
||||
- YouTube: Video description
|
||||
- Twitter/X: Full tweet text
|
||||
- Instagram: Full caption
|
||||
range: string
|
||||
required: false
|
||||
examples:
|
||||
- value: "De videoreeks De Vrijheidsroute is gebaseerd op de gelijknamige fietsroute..."
|
||||
description: "YouTube video description"
|
||||
|
||||
published_at:
|
||||
slot_uri: dcterms:created
|
||||
description: |
|
||||
Date/time when content was originally published.
|
||||
|
||||
Dublin Core: created for publication timestamp.
|
||||
|
||||
ISO 8601 format (e.g., "2025-07-30T18:05:15Z").
|
||||
range: datetime
|
||||
required: true
|
||||
examples:
|
||||
- value: "2025-07-30T18:05:15Z"
|
||||
description: "Published July 30, 2025"
|
||||
|
||||
updated_at:
|
||||
slot_uri: dcterms:modified
|
||||
description: |
|
||||
Date/time when content was last modified by the author.
|
||||
|
||||
Dublin Core: modified for last update timestamp.
|
||||
|
||||
May be null if content has never been edited.
|
||||
range: datetime
|
||||
required: false
|
||||
examples:
|
||||
- value: "2025-08-01T10:30:00Z"
|
||||
description: "Last edited August 1, 2025"
|
||||
|
||||
language:
|
||||
slot_uri: dcterms:language
|
||||
description: |
|
||||
Primary language of the content.
|
||||
|
||||
Dublin Core: language for content language.
|
||||
|
||||
ISO 639-1 code (e.g., "nl", "en", "de").
|
||||
range: string
|
||||
required: false
|
||||
examples:
|
||||
- value: "nl"
|
||||
description: "Dutch language content"
|
||||
|
||||
tags:
|
||||
slot_uri: schema:keywords
|
||||
description: |
|
||||
Tags, hashtags, or keywords associated with the content.
|
||||
|
||||
Schema.org: keywords for topic classification.
|
||||
|
||||
Platform-specific:
|
||||
- YouTube: Video tags (author-defined)
|
||||
- Twitter/X: Hashtags
|
||||
- Instagram: Hashtags from caption
|
||||
range: string
|
||||
multivalued: true
|
||||
required: false
|
||||
examples:
|
||||
- value: ["80 jaar vrijheid", "wo2", "vrijheidsroute"]
|
||||
description: "YouTube video tags"
|
||||
|
||||
thumbnail_url:
|
||||
slot_uri: schema:thumbnailUrl
|
||||
description: |
|
||||
URL to a thumbnail/preview image for the content.
|
||||
|
||||
Schema.org: thumbnailUrl for preview image.
|
||||
range: uri
|
||||
required: false
|
||||
examples:
|
||||
- value: "https://i.ytimg.com/vi/FbIoC-Owy-M/hqdefault.jpg"
|
||||
description: "YouTube video thumbnail"
|
||||
|
||||
is_official_content:
|
||||
slot_uri: hc:isOfficialContent
|
||||
description: |
|
||||
Whether this content was posted by the heritage institution's official account.
|
||||
|
||||
- **true**: Posted by the custodian's verified/official account
|
||||
- **false**: Third-party content (visitors, media, etc.) about the institution
|
||||
|
||||
Helps distinguish official communications from external coverage.
|
||||
range: boolean
|
||||
required: false
|
||||
ifabsent: "true"
|
||||
examples:
|
||||
- value: true
|
||||
description: "Posted by official museum channel"
|
||||
|
||||
content_category:
|
||||
slot_uri: schema:genre
|
||||
description: |
|
||||
Category or genre of the content.
|
||||
|
||||
Schema.org: genre for content classification.
|
||||
|
||||
Platform-specific category systems:
|
||||
- YouTube: Category ID (e.g., "22" = People & Blogs)
|
||||
- Instagram: N/A
|
||||
- TikTok: Category/trend
|
||||
range: string
|
||||
required: false
|
||||
examples:
|
||||
- value: "22"
|
||||
description: "YouTube category ID for People & Blogs"
|
||||
|
||||
retrieval_timestamp:
|
||||
slot_uri: prov:atTime
|
||||
description: |
|
||||
Timestamp when this content data was retrieved from the platform.
|
||||
|
||||
PROV-O: atTime for observation timestamp.
|
||||
|
||||
Critical for understanding data freshness, especially for metrics.
|
||||
range: datetime
|
||||
required: true
|
||||
examples:
|
||||
- value: "2025-12-01T23:16:22.294232+00:00"
|
||||
description: "Retrieved December 1, 2025"
|
||||
|
||||
api_endpoint:
|
||||
slot_uri: prov:wasGeneratedBy
|
||||
description: |
|
||||
The API endpoint or method used to retrieve this content.
|
||||
|
||||
PROV-O: wasGeneratedBy for generation method.
|
||||
|
||||
Examples:
|
||||
- "https://www.googleapis.com/youtube/v3"
|
||||
- "https://api.twitter.com/2/tweets"
|
||||
- "web_scrape"
|
||||
range: string
|
||||
required: false
|
||||
examples:
|
||||
- value: "https://www.googleapis.com/youtube/v3"
|
||||
description: "YouTube Data API v3"
|
||||
|
||||
api_version:
|
||||
slot_uri: schema:softwareVersion
|
||||
description: |
|
||||
Version of the API used for retrieval.
|
||||
|
||||
Schema.org: softwareVersion for API version tracking.
|
||||
range: string
|
||||
required: false
|
||||
examples:
|
||||
- value: "v3"
|
||||
description: "YouTube API version 3"
|
||||
|
||||
comments:
|
||||
- "Abstract base class - use specific subclasses (VideoPost, ImagePost, etc.)"
|
||||
- "Represents individual CONTENT items, not profiles or platforms"
|
||||
- "Activity Streams 2.0 alignment enables ActivityPub federation"
|
||||
- "Metrics are observational - always include retrieval_timestamp"
|
||||
- "Supports both official institutional content and third-party coverage"
|
||||
|
||||
see_also:
|
||||
- "https://www.w3.org/ns/activitystreams#Object"
|
||||
- "https://schema.org/CreativeWork"
|
||||
- "https://schema.org/SocialMediaPosting"
|
||||
|
||||
# Slot definitions
|
||||
slots:
|
||||
content_id:
|
||||
description: Platform-specific unique identifier for content
|
||||
range: string
|
||||
|
||||
content_url:
|
||||
description: Canonical URL to access the content
|
||||
range: uri
|
||||
|
||||
posted_by_profile:
|
||||
description: Social media profile that posted this content
|
||||
range: SocialMediaProfile
|
||||
|
||||
is_official_content:
|
||||
description: Whether content is from official institutional account
|
||||
range: boolean
|
||||
|
||||
content_category:
|
||||
description: Platform-specific category/genre
|
||||
range: string
|
||||
|
||||
retrieval_timestamp:
|
||||
description: When content data was retrieved
|
||||
range: datetime
|
||||
|
||||
api_endpoint:
|
||||
description: API used to retrieve content
|
||||
range: string
|
||||
|
||||
api_version:
|
||||
description: Version of API used
|
||||
range: string
|
||||
|
||||
tags:
|
||||
description: Keywords/hashtags for the content
|
||||
range: string
|
||||
multivalued: true
|
||||
|
||||
thumbnail_url:
|
||||
description: URL to preview/thumbnail image
|
||||
range: uri
|
||||
540
schemas/20251121/linkml/modules/classes/SocialMediaPost.yaml
Normal file
540
schemas/20251121/linkml/modules/classes/SocialMediaPost.yaml
Normal file
|
|
@ -0,0 +1,540 @@
|
|||
# Social Media Post Class
|
||||
# Concrete class for social media posts with multivalued post type support
|
||||
#
|
||||
# CONCEPTUAL HIERARCHY:
|
||||
#
|
||||
# SocialMediaPlatformType → SocialMediaProfile → SocialMediaPost
|
||||
# (Platform) (Account/Channel) (Individual Post)
|
||||
# ↓
|
||||
# post_types (multivalued)
|
||||
# ↓
|
||||
# SocialMediaPostType[]
|
||||
#
|
||||
# This class represents individual content items posted on social media platforms.
|
||||
# A single post can have MULTIPLE post types (e.g., a carousel with images AND videos).
|
||||
#
|
||||
# DESIGN RATIONALE:
|
||||
# Social media content often combines multiple formats:
|
||||
# - A carousel may contain both images and videos
|
||||
# - A thread consists of multiple text posts with attached media
|
||||
# - A live stream becomes a standard video when archived
|
||||
# - A podcast episode may also be published as a video
|
||||
#
|
||||
# The multivalued post_types slot captures this reality.
|
||||
|
||||
id: https://nde.nl/ontology/hc/class/SocialMediaPost
|
||||
name: social_media_post_class
|
||||
title: Social Media Post Class
|
||||
|
||||
imports:
|
||||
- linkml:types
|
||||
- ./SocialMediaProfile
|
||||
- ./SocialMediaPlatformType
|
||||
- ./SocialMediaPostType
|
||||
- ./TimeSpan
|
||||
- ./WebObservation
|
||||
- ../slots/language
|
||||
|
||||
prefixes:
|
||||
linkml: https://w3id.org/linkml/
|
||||
hc: https://nde.nl/ontology/hc/
|
||||
schema: http://schema.org/
|
||||
foaf: http://xmlns.com/foaf/0.1/
|
||||
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#
|
||||
|
||||
default_prefix: hc
|
||||
|
||||
classes:
|
||||
SocialMediaPost:
|
||||
class_uri: as:Object
|
||||
abstract: false
|
||||
description: |
|
||||
Concrete class for social media posts/content items.
|
||||
|
||||
**DEFINITION**:
|
||||
|
||||
SocialMediaPost represents a discrete piece of content published on a social media
|
||||
platform. This includes videos, images, text posts, stories, carousels, threads,
|
||||
and other content types. Each post is published by a SocialMediaProfile (account/channel).
|
||||
|
||||
**CRITICAL: MULTIVALUED POST TYPES**:
|
||||
|
||||
A single SocialMediaPost can have **multiple** post types via the `post_types` slot.
|
||||
This reflects the reality that social media content often combines formats:
|
||||
|
||||
| Post Example | Primary Type | Secondary Types |
|
||||
|--------------|--------------|-----------------|
|
||||
| Instagram carousel with videos | CarouselPostType | ImagePostType, VideoPostType |
|
||||
| Twitter thread with images | ThreadPostType | TextPostType, ImagePostType |
|
||||
| YouTube Live archived as video | LiveStreamPostType | VideoPostType |
|
||||
| Podcast with video recording | AudioPostType | VideoPostType |
|
||||
| Story highlight (saved) | StoryPostType | ImagePostType, VideoPostType |
|
||||
|
||||
**TYPE ORDERING CONVENTION**:
|
||||
- First type in list = primary/dominant format
|
||||
- Subsequent types = secondary characteristics
|
||||
- Order matters for display and categorization
|
||||
|
||||
**CRITICAL: POST vs PROFILE vs PLATFORM**:
|
||||
|
||||
| Class | Represents | Example | Cardinality |
|
||||
|-------|------------|---------|-------------|
|
||||
| SocialMediaPlatformType | Platform category | YouTube | ~25 types |
|
||||
| SocialMediaProfile | Account/channel | @rijksmuseum | Thousands |
|
||||
| **SocialMediaPost** | Individual content | A video, post | Millions |
|
||||
|
||||
**ACTIVITY STREAMS 2.0 ALIGNMENT**:
|
||||
|
||||
Maps to `as:Object` from W3C Activity Streams 2.0 vocabulary:
|
||||
- as:Object is the base type for content in social media
|
||||
- Individual posts may also map to as:Video, as:Image, as:Note based on post_types
|
||||
- Enables federation with ActivityPub-based platforms (Mastodon, PeerTube)
|
||||
|
||||
**HERITAGE INSTITUTION CONTEXT**:
|
||||
|
||||
Social media content from heritage institutions includes:
|
||||
|
||||
1. **Official content** (posted by the institution):
|
||||
- Collection highlights (ImagePostType)
|
||||
- Exhibition announcements (TextPostType)
|
||||
- Educational videos (VideoPostType)
|
||||
- Behind-the-scenes content (ShortVideoPostType, StoryPostType)
|
||||
- Event recordings (LiveStreamPostType → VideoPostType)
|
||||
- Curator interviews (VideoPostType, AudioPostType)
|
||||
- Multi-image collection stories (CarouselPostType)
|
||||
|
||||
2. **Third-party content** (about the institution):
|
||||
- Visitor videos/photos
|
||||
- News coverage
|
||||
- Academic discussions
|
||||
- Review content
|
||||
|
||||
3. **User-generated content** (mentions):
|
||||
- Tagged posts
|
||||
- Check-ins
|
||||
- Comments/discussions
|
||||
|
||||
**PROVENANCE TRACKING**:
|
||||
|
||||
Content items are OBSERVATIONAL data retrieved via:
|
||||
- Platform APIs (YouTube Data API, Twitter API, etc.)
|
||||
- Web scraping (when API unavailable)
|
||||
- Manual archival
|
||||
|
||||
Each content record includes:
|
||||
- `retrieval_timestamp`: When content was fetched
|
||||
- `api_endpoint`: Which API/method was used
|
||||
- `metrics_observed_date`: When engagement metrics were recorded
|
||||
|
||||
**TEMPORAL CONSIDERATIONS**:
|
||||
|
||||
Content has multiple temporal dimensions:
|
||||
- `published_at`: When originally posted
|
||||
- `updated_at`: Last modification by author
|
||||
- `retrieval_timestamp`: When we fetched it
|
||||
- `metrics_observed_date`: When metrics (views, likes) were recorded
|
||||
|
||||
Engagement metrics change constantly; always record observation timestamp.
|
||||
|
||||
**SUBCLASSES FOR SPECIALIZED CONTENT**:
|
||||
|
||||
While SocialMediaPost can represent any content with post_types,
|
||||
specialized subclasses provide additional platform-specific slots:
|
||||
|
||||
- **VideoPost**: YouTube, TikTok, Vimeo videos (duration, definition, captions)
|
||||
- **ImagePost**: Instagram, Pinterest posts (dimensions, alt_text) [future]
|
||||
- **TextPost**: Twitter/X, Mastodon posts (character_count) [future]
|
||||
- **StoryPost**: Instagram/Facebook stories (ephemeral, segments) [future]
|
||||
|
||||
exact_mappings:
|
||||
- as:Object
|
||||
|
||||
close_mappings:
|
||||
- schema:CreativeWork
|
||||
- crm:E73_Information_Object
|
||||
|
||||
related_mappings:
|
||||
- schema:SocialMediaPosting
|
||||
- dcterms:BibliographicResource
|
||||
|
||||
slots:
|
||||
# Identification
|
||||
- post_id
|
||||
- post_url
|
||||
|
||||
# Type classification (MULTIVALUED!)
|
||||
- post_types
|
||||
- platform_type
|
||||
|
||||
# Authorship
|
||||
- posted_by_profile
|
||||
- is_official_content
|
||||
|
||||
# Content metadata
|
||||
- title
|
||||
- description
|
||||
- language
|
||||
- tags
|
||||
- thumbnail_url
|
||||
- content_category
|
||||
|
||||
# Temporal
|
||||
- published_at
|
||||
- updated_at
|
||||
|
||||
# Provenance
|
||||
- retrieval_timestamp
|
||||
- api_endpoint
|
||||
- api_version
|
||||
|
||||
slot_usage:
|
||||
post_id:
|
||||
slot_uri: dcterms:identifier
|
||||
description: |
|
||||
Unique identifier for this post.
|
||||
|
||||
Format varies by platform:
|
||||
- YouTube: Video ID (e.g., "dQw4w9WgXcQ")
|
||||
- Twitter/X: Tweet ID (numeric string)
|
||||
- Instagram: Media ID or shortcode
|
||||
|
||||
Combined with platform type, this uniquely identifies content globally.
|
||||
range: string
|
||||
required: true
|
||||
identifier: true
|
||||
examples:
|
||||
- value: "FbIoC-Owy-M"
|
||||
description: "YouTube video ID"
|
||||
- value: "1234567890123456789"
|
||||
description: "Twitter/X tweet ID"
|
||||
|
||||
post_url:
|
||||
slot_uri: schema:url
|
||||
description: |
|
||||
Canonical URL to access this post on its native platform.
|
||||
|
||||
URL patterns by platform:
|
||||
- YouTube: https://www.youtube.com/watch?v={video_id}
|
||||
- Twitter/X: https://x.com/{user}/status/{tweet_id}
|
||||
- Instagram: https://www.instagram.com/p/{shortcode}
|
||||
- Mastodon: https://{instance}/@{user}/{post_id}
|
||||
range: uri
|
||||
required: true
|
||||
pattern: "^https?://"
|
||||
examples:
|
||||
- value: "https://www.youtube.com/watch?v=FbIoC-Owy-M"
|
||||
description: "YouTube video URL"
|
||||
|
||||
post_types:
|
||||
slot_uri: dcterms:type
|
||||
description: |
|
||||
The type(s) of content in this post.
|
||||
|
||||
**MULTIVALUED**: A single post can have multiple types!
|
||||
|
||||
Uses SocialMediaPostType class hierarchy for standardized categorization.
|
||||
|
||||
**Ordering Convention**:
|
||||
- First type = primary/dominant format
|
||||
- Subsequent types = secondary characteristics
|
||||
|
||||
**Examples**:
|
||||
|
||||
| Post | post_types Value |
|
||||
|------|------------------|
|
||||
| YouTube video | [VideoPostType] |
|
||||
| Instagram carousel | [CarouselPostType, ImagePostType, VideoPostType] |
|
||||
| Twitter thread | [ThreadPostType, TextPostType, ImagePostType] |
|
||||
| YouTube Live (archived) | [LiveStreamPostType, VideoPostType] |
|
||||
| Podcast on YouTube | [AudioPostType, VideoPostType] |
|
||||
range: SocialMediaPostType
|
||||
multivalued: true
|
||||
required: true
|
||||
inlined: false
|
||||
examples:
|
||||
- value: "[VideoPostType]"
|
||||
description: "Standard video content"
|
||||
- value: "[CarouselPostType, ImagePostType, VideoPostType]"
|
||||
description: "Instagram carousel with mixed media"
|
||||
|
||||
platform_type:
|
||||
slot_uri: hc:platformType
|
||||
description: |
|
||||
The social media platform where this post was published.
|
||||
|
||||
Uses SocialMediaPlatformType class hierarchy.
|
||||
|
||||
Distinct from post_types which describes CONTENT format,
|
||||
platform_type describes WHERE it was posted.
|
||||
range: SocialMediaPlatformType
|
||||
required: true
|
||||
inlined: false
|
||||
examples:
|
||||
- value: "YouTube"
|
||||
description: "Posted on YouTube"
|
||||
|
||||
posted_by_profile:
|
||||
slot_uri: as:attributedTo
|
||||
description: |
|
||||
The social media profile (account/channel) that posted this content.
|
||||
|
||||
Activity Streams: attributedTo identifies the actor responsible for the content.
|
||||
|
||||
Links to SocialMediaProfile which in turn links to the Custodian hub.
|
||||
range: SocialMediaProfile
|
||||
required: false
|
||||
inlined: false
|
||||
examples:
|
||||
- value: "https://nde.nl/ontology/hc/social-media/nationaal-onderduikmuseum-youtube"
|
||||
description: "Museum's YouTube channel profile"
|
||||
|
||||
title:
|
||||
slot_uri: dcterms:title
|
||||
description: |
|
||||
Title or headline of the post.
|
||||
|
||||
Dublin Core: title for the content's name.
|
||||
|
||||
Platform behavior:
|
||||
- YouTube videos: Video title
|
||||
- Twitter/X: First line of tweet (or null)
|
||||
- Instagram: Caption beginning
|
||||
- Threads: First post text
|
||||
range: string
|
||||
required: false
|
||||
examples:
|
||||
- value: "De Vrijheidsroute (aflevering 3) – Zevenaar, Duiven, Westervoort"
|
||||
description: "YouTube video title"
|
||||
|
||||
description:
|
||||
slot_uri: dcterms:description
|
||||
description: |
|
||||
Full description or body text of the post.
|
||||
|
||||
Dublin Core: description for content text.
|
||||
|
||||
Platform behavior:
|
||||
- YouTube: Video description
|
||||
- Twitter/X: Full tweet text
|
||||
- Instagram: Full caption
|
||||
- Thread: Combined text of all posts in thread
|
||||
range: string
|
||||
required: false
|
||||
examples:
|
||||
- value: "De videoreeks De Vrijheidsroute is gebaseerd op de gelijknamige fietsroute..."
|
||||
description: "YouTube video description"
|
||||
|
||||
published_at:
|
||||
slot_uri: dcterms:created
|
||||
description: |
|
||||
Date/time when post was originally published.
|
||||
|
||||
Dublin Core: created for publication timestamp.
|
||||
|
||||
ISO 8601 format (e.g., "2025-07-30T18:05:15Z").
|
||||
range: datetime
|
||||
required: true
|
||||
examples:
|
||||
- value: "2025-07-30T18:05:15Z"
|
||||
description: "Published July 30, 2025"
|
||||
|
||||
updated_at:
|
||||
slot_uri: dcterms:modified
|
||||
description: |
|
||||
Date/time when post was last modified by the author.
|
||||
|
||||
Dublin Core: modified for last update timestamp.
|
||||
|
||||
May be null if post has never been edited.
|
||||
range: datetime
|
||||
required: false
|
||||
examples:
|
||||
- value: "2025-08-01T10:30:00Z"
|
||||
description: "Last edited August 1, 2025"
|
||||
|
||||
language:
|
||||
slot_uri: dcterms:language
|
||||
description: |
|
||||
Primary language of the post.
|
||||
|
||||
Dublin Core: language for content language.
|
||||
|
||||
ISO 639-1 code (e.g., "nl", "en", "de").
|
||||
range: string
|
||||
required: false
|
||||
examples:
|
||||
- value: "nl"
|
||||
description: "Dutch language content"
|
||||
|
||||
tags:
|
||||
slot_uri: schema:keywords
|
||||
description: |
|
||||
Tags, hashtags, or keywords associated with the post.
|
||||
|
||||
Schema.org: keywords for topic classification.
|
||||
|
||||
Platform-specific:
|
||||
- YouTube: Video tags (author-defined)
|
||||
- Twitter/X: Hashtags
|
||||
- Instagram: Hashtags from caption
|
||||
range: string
|
||||
multivalued: true
|
||||
required: false
|
||||
examples:
|
||||
- value: ["80 jaar vrijheid", "wo2", "vrijheidsroute"]
|
||||
description: "YouTube video tags"
|
||||
|
||||
thumbnail_url:
|
||||
slot_uri: schema:thumbnailUrl
|
||||
description: |
|
||||
URL to a thumbnail/preview image for the post.
|
||||
|
||||
Schema.org: thumbnailUrl for preview image.
|
||||
range: uri
|
||||
required: false
|
||||
examples:
|
||||
- value: "https://i.ytimg.com/vi/FbIoC-Owy-M/hqdefault.jpg"
|
||||
description: "YouTube video thumbnail"
|
||||
|
||||
is_official_content:
|
||||
slot_uri: hc:isOfficialContent
|
||||
description: |
|
||||
Whether this post was published by the heritage institution's official account.
|
||||
|
||||
- **true**: Posted by the custodian's verified/official account
|
||||
- **false**: Third-party content (visitors, media, etc.) about the institution
|
||||
|
||||
Helps distinguish official communications from external coverage.
|
||||
range: boolean
|
||||
required: false
|
||||
ifabsent: "true"
|
||||
examples:
|
||||
- value: true
|
||||
description: "Posted by official museum channel"
|
||||
|
||||
content_category:
|
||||
slot_uri: schema:genre
|
||||
description: |
|
||||
Category or genre of the post.
|
||||
|
||||
Schema.org: genre for content classification.
|
||||
|
||||
Platform-specific category systems:
|
||||
- YouTube: Category ID (e.g., "22" = People & Blogs)
|
||||
- Instagram: N/A
|
||||
- TikTok: Category/trend
|
||||
range: string
|
||||
required: false
|
||||
examples:
|
||||
- value: "22"
|
||||
description: "YouTube category ID for People & Blogs"
|
||||
|
||||
retrieval_timestamp:
|
||||
slot_uri: prov:atTime
|
||||
description: |
|
||||
Timestamp when this post data was retrieved from the platform.
|
||||
|
||||
PROV-O: atTime for observation timestamp.
|
||||
|
||||
Critical for understanding data freshness, especially for metrics.
|
||||
range: datetime
|
||||
required: true
|
||||
examples:
|
||||
- value: "2025-12-01T23:16:22.294232+00:00"
|
||||
description: "Retrieved December 1, 2025"
|
||||
|
||||
api_endpoint:
|
||||
slot_uri: prov:wasGeneratedBy
|
||||
description: |
|
||||
The API endpoint or method used to retrieve this post.
|
||||
|
||||
PROV-O: wasGeneratedBy for generation method.
|
||||
|
||||
Examples:
|
||||
- "https://www.googleapis.com/youtube/v3"
|
||||
- "https://api.twitter.com/2/tweets"
|
||||
- "web_scrape"
|
||||
range: string
|
||||
required: false
|
||||
examples:
|
||||
- value: "https://www.googleapis.com/youtube/v3"
|
||||
description: "YouTube Data API v3"
|
||||
|
||||
api_version:
|
||||
slot_uri: schema:softwareVersion
|
||||
description: |
|
||||
Version of the API used for retrieval.
|
||||
|
||||
Schema.org: softwareVersion for API version tracking.
|
||||
range: string
|
||||
required: false
|
||||
examples:
|
||||
- value: "v3"
|
||||
description: "YouTube API version 3"
|
||||
|
||||
comments:
|
||||
- "Concrete class for social media posts"
|
||||
- "post_types is MULTIVALUED - a post can have multiple content types"
|
||||
- "First type in post_types list is the primary format"
|
||||
- "Use specialized subclasses (VideoPost) for platform-specific properties"
|
||||
- "Activity Streams 2.0 alignment enables ActivityPub federation"
|
||||
- "Metrics are observational - always include retrieval_timestamp"
|
||||
|
||||
see_also:
|
||||
- "https://www.w3.org/ns/activitystreams#Object"
|
||||
- "https://schema.org/CreativeWork"
|
||||
- "https://schema.org/SocialMediaPosting"
|
||||
|
||||
# Slot definitions
|
||||
slots:
|
||||
post_id:
|
||||
description: Platform-specific unique identifier for the post
|
||||
range: string
|
||||
|
||||
post_url:
|
||||
description: Canonical URL to access the post
|
||||
range: uri
|
||||
|
||||
post_types:
|
||||
description: |
|
||||
Type(s) of content in this post (MULTIVALUED).
|
||||
First type is primary format, subsequent types are secondary.
|
||||
range: SocialMediaPostType
|
||||
multivalued: true
|
||||
|
||||
posted_by_profile:
|
||||
description: Social media profile that published this post
|
||||
range: SocialMediaProfile
|
||||
|
||||
is_official_content:
|
||||
description: Whether post is from official institutional account
|
||||
range: boolean
|
||||
|
||||
content_category:
|
||||
description: Platform-specific category/genre
|
||||
range: string
|
||||
|
||||
retrieval_timestamp:
|
||||
description: When post data was retrieved
|
||||
range: datetime
|
||||
|
||||
api_endpoint:
|
||||
description: API used to retrieve post
|
||||
range: string
|
||||
|
||||
api_version:
|
||||
description: Version of API used
|
||||
range: string
|
||||
|
||||
tags:
|
||||
description: Keywords/hashtags for the post
|
||||
range: string
|
||||
multivalued: true
|
||||
|
||||
thumbnail_url:
|
||||
description: URL to preview/thumbnail image
|
||||
range: uri
|
||||
423
schemas/20251121/linkml/modules/classes/SocialMediaPostType.yaml
Normal file
423
schemas/20251121/linkml/modules/classes/SocialMediaPostType.yaml
Normal file
|
|
@ -0,0 +1,423 @@
|
|||
# Social Media Post Type Base Class
|
||||
# Base class for all social media post/content type classifications
|
||||
#
|
||||
# CRITICAL CONCEPTUAL NOTE:
|
||||
# These classes represent TYPES of social media posts/content.
|
||||
# They categorize content by format, duration, and platform features.
|
||||
#
|
||||
# The SocialMediaPost class uses post_type to reference these types.
|
||||
# This class hierarchy enables richer semantic modeling of content formats.
|
||||
#
|
||||
# DISTINCTION FROM SocialMediaPost:
|
||||
# - SocialMediaPost: An individual content instance (e.g., a specific YouTube video)
|
||||
# - SocialMediaPostType: A classification of content formats (e.g., VideoPost, ImagePost)
|
||||
|
||||
id: https://nde.nl/ontology/hc/class/SocialMediaPostType
|
||||
name: social_media_post_type_class
|
||||
title: Social Media Post Type Base Class
|
||||
|
||||
prefixes:
|
||||
linkml: https://w3id.org/linkml/
|
||||
hc: https://nde.nl/ontology/hc/
|
||||
schema: http://schema.org/
|
||||
dcterms: http://purl.org/dc/terms/
|
||||
skos: http://www.w3.org/2004/02/skos/core#
|
||||
as: https://www.w3.org/ns/activitystreams#
|
||||
wikidata: http://www.wikidata.org/entity/
|
||||
|
||||
imports:
|
||||
- linkml:types
|
||||
- ../metadata
|
||||
|
||||
classes:
|
||||
SocialMediaPostType:
|
||||
class_uri: skos:Concept
|
||||
abstract: true
|
||||
description: |
|
||||
Abstract base class for social media post/content type classifications in the heritage domain.
|
||||
|
||||
**DEFINITION**:
|
||||
|
||||
SocialMediaPostType represents CATEGORIES of social media content,
|
||||
not individual posts or media items. Each subclass defines characteristics
|
||||
of a content format (media type, duration, features, platform support, etc.).
|
||||
|
||||
**CRITICAL: TYPE vs INSTANCE**
|
||||
|
||||
| Aspect | SocialMediaPostType (This Class) | SocialMediaPost (Instance) |
|
||||
|--------|----------------------------------|---------------------------|
|
||||
| **Nature** | Content format classification | Individual content item |
|
||||
| **Examples** | VideoPostType, ImagePostType | A specific YouTube video |
|
||||
| **Properties** | Duration limits, features, platforms | View count, URL, author |
|
||||
| **Cardinality** | ~10 content types | Millions of posts |
|
||||
| **Relationship** | Referenced via `post_types` slot | Can have MULTIPLE types |
|
||||
|
||||
**CRITICAL: MULTIVALUED RELATIONSHIP**
|
||||
|
||||
A single SocialMediaPost can have **multiple** SocialMediaPostType values!
|
||||
This is essential because social media content often combines formats:
|
||||
|
||||
- A **carousel** contains both images AND videos
|
||||
- A **thread** combines text posts with attached images
|
||||
- A **live stream** becomes a standard video when archived
|
||||
- A **podcast** may also be published as a video recording
|
||||
|
||||
**ACTIVITY STREAMS 2.0 ALIGNMENT**:
|
||||
|
||||
Social media content types align with W3C Activity Streams 2.0:
|
||||
- `as:Video` - Video content (YouTube, TikTok, Reels)
|
||||
- `as:Image` - Image content (Instagram photos, Pinterest pins)
|
||||
- `as:Note` - Short text content (Tweets, Toots)
|
||||
- `as:Article` - Long-form content (Blog posts, newsletters)
|
||||
- `as:Audio` - Audio content (Podcasts, music tracks)
|
||||
|
||||
This enables federation with ActivityPub-based platforms (Mastodon, PeerTube).
|
||||
|
||||
**HERITAGE INSTITUTION CONTEXT**:
|
||||
|
||||
Cultural heritage institutions create diverse content types:
|
||||
|
||||
| Content Type | Heritage Use Cases |
|
||||
|--------------|-------------------|
|
||||
| **Video** | Virtual tours, conservation demos, interviews, lectures |
|
||||
| **Image** | Collection highlights, exhibition photos, archival scans |
|
||||
| **Short Video** | Behind-the-scenes moments, artifact spotlights |
|
||||
| **Text** | Announcements, event info, research updates |
|
||||
| **Story** | Ephemeral content for events, openings, daily life |
|
||||
| **Live Stream** | Exhibition openings, Q&A sessions, guided tours |
|
||||
| **Audio** | Podcasts about collections, audio guides, oral histories |
|
||||
| **Thread** | Multi-part narratives, collection deep-dives |
|
||||
|
||||
**CATEGORY STRUCTURE**:
|
||||
|
||||
Post types are organized into high-level categories:
|
||||
|
||||
1. **VIDEO**: Standard video content (YouTube, Vimeo, Facebook Video)
|
||||
2. **SHORT_VIDEO**: Short-form video (TikTok, Reels, YouTube Shorts)
|
||||
3. **IMAGE**: Static images (Instagram posts, Pinterest pins, Flickr photos)
|
||||
4. **TEXT**: Text-based posts (Tweets, Mastodon toots, LinkedIn posts)
|
||||
5. **STORY**: Ephemeral content (Instagram Stories, Facebook Stories)
|
||||
6. **LIVE_STREAM**: Real-time video (YouTube Live, Twitch, Instagram Live)
|
||||
7. **AUDIO**: Audio content (Podcasts, SoundCloud tracks, Spotify)
|
||||
8. **ARTICLE**: Long-form written content (Medium, Substack, blog posts)
|
||||
9. **THREAD**: Multi-post sequences (Twitter threads, Mastodon threads)
|
||||
10. **CAROUSEL**: Multi-image/video posts (Instagram carousels)
|
||||
|
||||
**PLATFORM SUPPORT MATRIX**:
|
||||
|
||||
| Post Type | YouTube | Instagram | TikTok | X/Twitter | LinkedIn |
|
||||
|-----------|---------|-----------|--------|-----------|----------|
|
||||
| Video | Yes | Yes | - | Yes | Yes |
|
||||
| Short Video | Shorts | Reels | Yes | - | - |
|
||||
| Image | Thumbnail | Yes | - | Yes | Yes |
|
||||
| Text | - | Caption | Caption | Yes | Yes |
|
||||
| Story | - | Yes | - | Fleets* | Stories |
|
||||
| Live | Yes | Yes | Yes | Spaces* | Live |
|
||||
|
||||
*Some features deprecated or limited
|
||||
|
||||
**USAGE IN SOCIALMEDIAPOST**:
|
||||
|
||||
The SocialMediaPost.post_types slot references these types as a **multivalued** slot:
|
||||
```yaml
|
||||
SocialMediaPost:
|
||||
post_types:
|
||||
range: SocialMediaPostType # Polymorphic - any subclass
|
||||
multivalued: true # A post can have MULTIPLE types!
|
||||
```
|
||||
|
||||
**WHY MULTIVALUED?**
|
||||
|
||||
A single social media post can legitimately have multiple types:
|
||||
|
||||
| Example | Primary Type | Secondary Types |
|
||||
|---------|--------------|-----------------|
|
||||
| Instagram carousel with videos | CarouselPostType | ImagePostType, VideoPostType |
|
||||
| Twitter thread with images | ThreadPostType | TextPostType, ImagePostType |
|
||||
| YouTube Live archived as video | LiveStreamPostType | VideoPostType |
|
||||
| Podcast with video recording | AudioPostType | VideoPostType |
|
||||
| Story highlight (saved) | StoryPostType | ImagePostType, VideoPostType |
|
||||
|
||||
**TYPE ORDERING**:
|
||||
- First type in list = primary/dominant format
|
||||
- Subsequent types = secondary characteristics
|
||||
- Order matters for display and categorization
|
||||
|
||||
**ONTOLOGY ALIGNMENT**:
|
||||
|
||||
- Activity Streams 2.0: W3C standard for social content
|
||||
- Schema.org: MediaObject, VideoObject, ImageObject
|
||||
- SKOS Concept: Post types as controlled vocabulary
|
||||
- Dublin Core: Standard metadata properties
|
||||
|
||||
**SUBCLASSES**:
|
||||
|
||||
See SocialMediaPostTypes.yaml for concrete post type subclasses:
|
||||
- VideoPostType: Standard video content
|
||||
- ShortVideoPostType: Short-form video (TikTok, Reels, Shorts)
|
||||
- ImagePostType: Photo and image posts
|
||||
- TextPostType: Text-based posts
|
||||
- StoryPostType: Ephemeral content
|
||||
- LiveStreamPostType: Real-time streaming
|
||||
- AudioPostType: Podcasts and audio content
|
||||
- ArticlePostType: Long-form written content
|
||||
- ThreadPostType: Multi-post sequences
|
||||
- CarouselPostType: Multi-media collections
|
||||
- OtherPostType: Fallback for emerging formats
|
||||
|
||||
exact_mappings:
|
||||
- skos:Concept
|
||||
- as:Object
|
||||
|
||||
close_mappings:
|
||||
- schema:MediaObject
|
||||
|
||||
slots:
|
||||
- post_type_id
|
||||
- post_type_name
|
||||
- post_type_category
|
||||
- post_type_description
|
||||
- post_type_activity_streams_type
|
||||
- post_type_schema_org_type
|
||||
- post_type_max_duration
|
||||
- post_type_ephemeral
|
||||
- post_type_supported_platforms
|
||||
- post_type_media_formats
|
||||
- post_type_heritage_use_cases
|
||||
|
||||
slot_usage:
|
||||
post_type_id:
|
||||
identifier: true
|
||||
required: true
|
||||
description: Unique identifier for this post type
|
||||
post_type_name:
|
||||
required: true
|
||||
description: |
|
||||
Canonical name for this post type.
|
||||
Used for display and cross-referencing.
|
||||
post_type_category:
|
||||
required: false
|
||||
description: |
|
||||
High-level category for grouping related post types.
|
||||
Values: VIDEO, SHORT_VIDEO, IMAGE, TEXT, STORY, LIVE_STREAM,
|
||||
AUDIO, ARTICLE, THREAD, CAROUSEL, OTHER
|
||||
|
||||
comments:
|
||||
- "Abstract base class - use specific subclasses (VideoPostType, ImagePostType, etc.)"
|
||||
- "Represents POST TYPES, not individual content instances"
|
||||
- "SocialMediaPost.post_type references these type classes"
|
||||
- "Organized by media format and platform features"
|
||||
- "Aligned with W3C Activity Streams 2.0 for federation support"
|
||||
|
||||
see_also:
|
||||
- "https://www.w3.org/ns/activitystreams#Object"
|
||||
- "https://schema.org/MediaObject"
|
||||
- "https://www.w3.org/TR/activitystreams-vocabulary/"
|
||||
|
||||
slots:
|
||||
post_type_id:
|
||||
description: Unique identifier for this post type
|
||||
range: uriorcurie
|
||||
slot_uri: dcterms:identifier
|
||||
|
||||
post_type_name:
|
||||
description: |
|
||||
Canonical name for this post type.
|
||||
Used for display and content categorization.
|
||||
|
||||
Examples: "Video", "Short Video", "Image Post", "Story", "Live Stream"
|
||||
range: string
|
||||
slot_uri: skos:prefLabel
|
||||
|
||||
post_type_category:
|
||||
description: |
|
||||
High-level category for grouping related post types.
|
||||
Enables filtering and analysis by content format.
|
||||
|
||||
Values from PostTypeCategoryEnum:
|
||||
- VIDEO: Standard video content
|
||||
- SHORT_VIDEO: Short-form video (< 60s typically)
|
||||
- IMAGE: Photo and image content
|
||||
- TEXT: Text-based posts
|
||||
- STORY: Ephemeral content (24-hour visibility)
|
||||
- LIVE_STREAM: Real-time video
|
||||
- AUDIO: Audio and podcast content
|
||||
- ARTICLE: Long-form written content
|
||||
- THREAD: Multi-post sequences
|
||||
- CAROUSEL: Multi-media collections
|
||||
- OTHER: Emerging or uncategorized formats
|
||||
range: string
|
||||
slot_uri: skos:broader
|
||||
|
||||
post_type_description:
|
||||
description: |
|
||||
Detailed description of this post type including purpose,
|
||||
characteristics, and typical use cases in heritage context.
|
||||
range: string
|
||||
slot_uri: skos:definition
|
||||
|
||||
post_type_activity_streams_type:
|
||||
description: |
|
||||
Corresponding W3C Activity Streams 2.0 type for this post format.
|
||||
Enables federation with ActivityPub-based platforms.
|
||||
|
||||
Common mappings:
|
||||
- Video → as:Video
|
||||
- Image → as:Image
|
||||
- Text → as:Note
|
||||
- Article → as:Article
|
||||
- Audio → as:Audio
|
||||
range: uriorcurie
|
||||
slot_uri: skos:exactMatch
|
||||
|
||||
post_type_schema_org_type:
|
||||
description: |
|
||||
Corresponding Schema.org type for this post format.
|
||||
Enables structured data and SEO optimization.
|
||||
|
||||
Common mappings:
|
||||
- Video → schema:VideoObject
|
||||
- Image → schema:ImageObject
|
||||
- Audio → schema:AudioObject
|
||||
- Article → schema:Article
|
||||
range: uriorcurie
|
||||
slot_uri: skos:closeMatch
|
||||
|
||||
post_type_max_duration:
|
||||
description: |
|
||||
Maximum duration for this content type (if applicable).
|
||||
Expressed as ISO 8601 duration (e.g., "PT60S" for 60 seconds).
|
||||
|
||||
Examples:
|
||||
- YouTube Shorts: PT60S (60 seconds)
|
||||
- TikTok: PT10M (10 minutes, extended from 3 min)
|
||||
- Instagram Reels: PT90S (90 seconds)
|
||||
- Instagram Stories: PT60S per segment
|
||||
- Standard YouTube: No practical limit
|
||||
range: string
|
||||
slot_uri: schema:duration
|
||||
|
||||
post_type_ephemeral:
|
||||
description: |
|
||||
Whether this content type is ephemeral (auto-deletes after period).
|
||||
|
||||
- Stories: Typically 24 hours
|
||||
- Fleets (deprecated): Was 24 hours
|
||||
- Regular posts: Not ephemeral (false)
|
||||
range: boolean
|
||||
slot_uri: hc:ephemeral
|
||||
|
||||
post_type_supported_platforms:
|
||||
description: |
|
||||
Social media platforms that support this content type.
|
||||
References SocialMediaPlatformType subclasses.
|
||||
|
||||
Examples for Short Video:
|
||||
- YouTube (as Shorts)
|
||||
- Instagram (as Reels)
|
||||
- TikTok (native format)
|
||||
- Facebook (as Reels)
|
||||
range: string
|
||||
multivalued: true
|
||||
slot_uri: schema:availableOnDevice
|
||||
|
||||
post_type_media_formats:
|
||||
description: |
|
||||
Supported media file formats for this content type.
|
||||
|
||||
Examples for Video:
|
||||
- video/mp4
|
||||
- video/webm
|
||||
- video/quicktime
|
||||
|
||||
Examples for Image:
|
||||
- image/jpeg
|
||||
- image/png
|
||||
- image/webp
|
||||
range: string
|
||||
multivalued: true
|
||||
slot_uri: schema:encodingFormat
|
||||
|
||||
post_type_heritage_use_cases:
|
||||
description: |
|
||||
Typical use cases for heritage institutions creating this content type.
|
||||
|
||||
Examples for Video:
|
||||
- Virtual exhibition tours
|
||||
- Conservation process documentation
|
||||
- Curator interviews
|
||||
- Historical documentary content
|
||||
- Educational lectures
|
||||
|
||||
Examples for Short Video:
|
||||
- Artifact spotlights
|
||||
- Behind-the-scenes moments
|
||||
- Quick conservation tips
|
||||
- Event teasers
|
||||
range: string
|
||||
multivalued: true
|
||||
slot_uri: schema:description
|
||||
|
||||
enums:
|
||||
PostTypeCategoryEnum:
|
||||
description: High-level categories for social media post type classification
|
||||
permissible_values:
|
||||
VIDEO:
|
||||
description: |
|
||||
Standard video content with no strict duration limit.
|
||||
Platforms: YouTube, Vimeo, Facebook Video, LinkedIn Video
|
||||
Activity Streams: as:Video
|
||||
Schema.org: schema:VideoObject
|
||||
SHORT_VIDEO:
|
||||
description: |
|
||||
Short-form video content, typically under 60-90 seconds.
|
||||
Platforms: TikTok, Instagram Reels, YouTube Shorts
|
||||
Optimized for mobile viewing and algorithmic discovery.
|
||||
IMAGE:
|
||||
description: |
|
||||
Static image content including photos and graphics.
|
||||
Platforms: Instagram, Pinterest, Flickr, Facebook, X/Twitter
|
||||
Activity Streams: as:Image
|
||||
Schema.org: schema:ImageObject
|
||||
TEXT:
|
||||
description: |
|
||||
Text-based posts, typically short-form.
|
||||
Platforms: X/Twitter, Mastodon, Bluesky, LinkedIn
|
||||
Activity Streams: as:Note
|
||||
May include attached media as supplements.
|
||||
STORY:
|
||||
description: |
|
||||
Ephemeral content that auto-deletes (typically 24 hours).
|
||||
Platforms: Instagram Stories, Facebook Stories, LinkedIn Stories
|
||||
Often vertical format, designed for mobile.
|
||||
LIVE_STREAM:
|
||||
description: |
|
||||
Real-time video broadcasting.
|
||||
Platforms: YouTube Live, Instagram Live, Twitch, LinkedIn Live
|
||||
May be archived as standard video after broadcast.
|
||||
AUDIO:
|
||||
description: |
|
||||
Audio-only content including podcasts and music.
|
||||
Platforms: Spotify, Apple Podcasts, SoundCloud
|
||||
Activity Streams: as:Audio
|
||||
Schema.org: schema:AudioObject
|
||||
ARTICLE:
|
||||
description: |
|
||||
Long-form written content.
|
||||
Platforms: Medium, Substack, LinkedIn Articles, blogs
|
||||
Activity Streams: as:Article
|
||||
Schema.org: schema:Article
|
||||
THREAD:
|
||||
description: |
|
||||
Multi-post sequences forming a narrative.
|
||||
Platforms: X/Twitter threads, Mastodon threads
|
||||
Connected series of posts, often numbered.
|
||||
CAROUSEL:
|
||||
description: |
|
||||
Multi-media post with multiple images or videos.
|
||||
Platforms: Instagram carousels, LinkedIn carousels
|
||||
Swipeable content collections, up to 10-20 items.
|
||||
OTHER:
|
||||
description: |
|
||||
Emerging or uncategorized content formats.
|
||||
Use for new platform features not yet classified.
|
||||
|
|
@ -0,0 +1,867 @@
|
|||
# Social Media Post Types - Concrete Subclasses
|
||||
# 11 post type subclasses for heritage institution social media content
|
||||
#
|
||||
# Part of Heritage Custodian Ontology v0.9.5
|
||||
# Class hierarchy for semantic modeling of content formats
|
||||
#
|
||||
# STRUCTURE:
|
||||
# - Each subclass inherits from SocialMediaPostType
|
||||
# - Maps to W3C Activity Streams 2.0 types for federation
|
||||
# - Maps to Schema.org types for structured data
|
||||
# - Documents heritage institution use cases
|
||||
#
|
||||
# CATEGORIES (11 total):
|
||||
# - VIDEO (1): VideoPostType
|
||||
# - SHORT_VIDEO (1): ShortVideoPostType
|
||||
# - IMAGE (1): ImagePostType
|
||||
# - TEXT (1): TextPostType
|
||||
# - STORY (1): StoryPostType
|
||||
# - LIVE_STREAM (1): LiveStreamPostType
|
||||
# - AUDIO (1): AudioPostType
|
||||
# - ARTICLE (1): ArticlePostType
|
||||
# - THREAD (1): ThreadPostType
|
||||
# - CAROUSEL (1): CarouselPostType
|
||||
# - OTHER (1): OtherPostType
|
||||
#
|
||||
# TOTAL: 11 post types
|
||||
|
||||
id: https://nde.nl/ontology/hc/class/SocialMediaPostTypes
|
||||
name: social_media_post_types
|
||||
title: Social Media Post Types Collection
|
||||
|
||||
prefixes:
|
||||
linkml: https://w3id.org/linkml/
|
||||
hc: https://nde.nl/ontology/hc/
|
||||
schema: http://schema.org/
|
||||
dcterms: http://purl.org/dc/terms/
|
||||
skos: http://www.w3.org/2004/02/skos/core#
|
||||
as: https://www.w3.org/ns/activitystreams#
|
||||
wikidata: http://www.wikidata.org/entity/
|
||||
|
||||
imports:
|
||||
- linkml:types
|
||||
- ../metadata
|
||||
- ./SocialMediaPostType
|
||||
|
||||
classes:
|
||||
|
||||
# ============================================================================
|
||||
# VIDEO CATEGORY
|
||||
# Standard video content (no strict duration limit)
|
||||
# ============================================================================
|
||||
|
||||
VideoPostType:
|
||||
is_a: SocialMediaPostType
|
||||
class_uri: as:Video
|
||||
description: |
|
||||
Standard video content with no strict duration limit.
|
||||
|
||||
**Activity Streams Mapping**: `as:Video`
|
||||
**Schema.org Mapping**: `schema:VideoObject`
|
||||
|
||||
**Platforms**:
|
||||
- YouTube (primary)
|
||||
- Vimeo
|
||||
- Facebook Video
|
||||
- LinkedIn Video
|
||||
- X/Twitter Video
|
||||
|
||||
**Duration Characteristics**:
|
||||
- YouTube: Up to 12 hours (for verified accounts)
|
||||
- Vimeo: Varies by plan (500MB-unlimited)
|
||||
- Facebook: Up to 4 hours
|
||||
- LinkedIn: Up to 10 minutes
|
||||
|
||||
**Heritage Use Cases**:
|
||||
|
||||
| Use Case | Description | Typical Duration |
|
||||
|----------|-------------|------------------|
|
||||
| Virtual tours | 360° or guided exhibition walkthroughs | 10-30 min |
|
||||
| Conservation | Restoration process documentation | 5-20 min |
|
||||
| Interviews | Curator, artist, or expert conversations | 15-60 min |
|
||||
| Lectures | Educational presentations | 30-90 min |
|
||||
| Documentaries | In-depth collection or history stories | 20-60 min |
|
||||
| Exhibition intro | Preview of new exhibitions | 2-5 min |
|
||||
|
||||
**Technical Properties**:
|
||||
- Resolution: Up to 8K on YouTube
|
||||
- Formats: MP4 (H.264), WebM, MOV
|
||||
- Captions: VTT, SRT supported
|
||||
- Chapters: Timestamp-based navigation
|
||||
|
||||
**Metadata Captured**:
|
||||
- Duration (ISO 8601)
|
||||
- Definition (SD, HD, 4K, 8K)
|
||||
- Caption availability
|
||||
- View/like/comment counts
|
||||
- Tags and categories
|
||||
|
||||
exact_mappings:
|
||||
- as:Video
|
||||
- schema:VideoObject
|
||||
|
||||
slot_usage:
|
||||
post_type_category:
|
||||
equals_string: VIDEO
|
||||
post_type_activity_streams_type:
|
||||
equals_string: as:Video
|
||||
post_type_schema_org_type:
|
||||
equals_string: schema:VideoObject
|
||||
post_type_ephemeral:
|
||||
equals_expression: "false"
|
||||
post_type_supported_platforms:
|
||||
equals_string_in:
|
||||
- YouTube
|
||||
- Vimeo
|
||||
- Facebook
|
||||
- LinkedIn
|
||||
- XTwitter
|
||||
post_type_media_formats:
|
||||
equals_string_in:
|
||||
- video/mp4
|
||||
- video/webm
|
||||
- video/quicktime
|
||||
|
||||
comments:
|
||||
- "Primary format for heritage institution video content"
|
||||
- "YouTube most common platform for GLAM sector"
|
||||
- "Supports captions, chapters, and community features"
|
||||
- "Long-form content for educational and documentary purposes"
|
||||
|
||||
# ============================================================================
|
||||
# SHORT_VIDEO CATEGORY
|
||||
# Short-form video content (typically under 60-90 seconds)
|
||||
# ============================================================================
|
||||
|
||||
ShortVideoPostType:
|
||||
is_a: SocialMediaPostType
|
||||
class_uri: hc:ShortVideo
|
||||
description: |
|
||||
Short-form video content optimized for mobile viewing and discovery.
|
||||
|
||||
**Activity Streams Mapping**: `as:Video` (with duration constraint)
|
||||
**Schema.org Mapping**: `schema:VideoObject`
|
||||
|
||||
**Platforms and Duration Limits**:
|
||||
|
||||
| Platform | Format Name | Max Duration |
|
||||
|----------|-------------|--------------|
|
||||
| TikTok | TikTok | 10 minutes (was 60s, 3min) |
|
||||
| YouTube | Shorts | 60 seconds |
|
||||
| Instagram | Reels | 90 seconds |
|
||||
| Facebook | Reels | 90 seconds |
|
||||
| Snapchat | Spotlight | 60 seconds |
|
||||
|
||||
**Characteristics**:
|
||||
- Vertical format (9:16 aspect ratio)
|
||||
- Mobile-first design
|
||||
- Sound-on experience
|
||||
- Algorithm-driven discovery
|
||||
- Looping playback
|
||||
- Quick, attention-grabbing content
|
||||
|
||||
**Heritage Use Cases**:
|
||||
|
||||
| Use Case | Description | Example |
|
||||
|----------|-------------|---------|
|
||||
| Artifact spotlight | Quick focus on single object | "Object of the Day" |
|
||||
| Behind-the-scenes | Brief peek at non-public areas | Storage room tour |
|
||||
| Conservation tip | Quick preservation advice | "How to store photos" |
|
||||
| Event teaser | Promote upcoming exhibition | Opening night preview |
|
||||
| Fun facts | Surprising collection stories | "Did you know..." |
|
||||
| Trending sounds | Participate in viral trends | Museum-themed memes |
|
||||
|
||||
**Technical Properties**:
|
||||
- Resolution: 1080x1920 (vertical)
|
||||
- Formats: MP4 (H.264)
|
||||
- Auto-captions: Generated by platforms
|
||||
- Music/sound: Platform audio libraries
|
||||
|
||||
exact_mappings:
|
||||
- schema:VideoObject
|
||||
|
||||
close_mappings:
|
||||
- as:Video
|
||||
|
||||
slot_usage:
|
||||
post_type_category:
|
||||
equals_string: SHORT_VIDEO
|
||||
post_type_activity_streams_type:
|
||||
equals_string: as:Video
|
||||
post_type_schema_org_type:
|
||||
equals_string: schema:VideoObject
|
||||
post_type_max_duration:
|
||||
equals_string: PT90S
|
||||
post_type_ephemeral:
|
||||
equals_expression: "false"
|
||||
post_type_supported_platforms:
|
||||
equals_string_in:
|
||||
- TikTok
|
||||
- YouTube
|
||||
- Instagram
|
||||
- Facebook
|
||||
- Snapchat
|
||||
|
||||
comments:
|
||||
- "Fastest-growing content format 2020-2024"
|
||||
- "Essential for reaching younger audiences"
|
||||
- "Vertical format (9:16) required"
|
||||
- "TikTok pioneered format, others followed"
|
||||
|
||||
# ============================================================================
|
||||
# IMAGE CATEGORY
|
||||
# Static image content including photos and graphics
|
||||
# ============================================================================
|
||||
|
||||
ImagePostType:
|
||||
is_a: SocialMediaPostType
|
||||
class_uri: as:Image
|
||||
description: |
|
||||
Static image content including photographs, graphics, and artwork scans.
|
||||
|
||||
**Activity Streams Mapping**: `as:Image`
|
||||
**Schema.org Mapping**: `schema:ImageObject`
|
||||
|
||||
**Platforms**:
|
||||
- Instagram (primary image platform)
|
||||
- Pinterest (discovery and curation)
|
||||
- Flickr (high-resolution, Creative Commons)
|
||||
- Facebook
|
||||
- X/Twitter
|
||||
- LinkedIn
|
||||
|
||||
**Image Specifications by Platform**:
|
||||
|
||||
| Platform | Optimal Size | Aspect Ratios |
|
||||
|----------|--------------|---------------|
|
||||
| Instagram | 1080x1080 | 1:1, 4:5, 1.91:1 |
|
||||
| Pinterest | 1000x1500 | 2:3 (vertical) |
|
||||
| Flickr | Original resolution | Any |
|
||||
| X/Twitter | 1200x675 | 16:9 |
|
||||
| Facebook | 1200x630 | 1.91:1 |
|
||||
|
||||
**Heritage Use Cases**:
|
||||
|
||||
| Use Case | Description | Platform Focus |
|
||||
|----------|-------------|----------------|
|
||||
| Collection highlights | Featured artworks/artifacts | Instagram, Pinterest |
|
||||
| Exhibition photos | Installation and opening shots | All platforms |
|
||||
| Archival scans | Historical documents and photos | Flickr, Instagram |
|
||||
| Infographics | Educational visual content | Pinterest, Instagram |
|
||||
| Before/after | Conservation progress | Instagram, Facebook |
|
||||
| Detail shots | Close-up of artwork features | Instagram, Flickr |
|
||||
|
||||
**Metadata Captured**:
|
||||
- Dimensions (width, height)
|
||||
- Alt text / accessibility description
|
||||
- Location tags
|
||||
- Object references (linked to collection database)
|
||||
- Copyright and licensing
|
||||
|
||||
exact_mappings:
|
||||
- as:Image
|
||||
- schema:ImageObject
|
||||
|
||||
slot_usage:
|
||||
post_type_category:
|
||||
equals_string: IMAGE
|
||||
post_type_activity_streams_type:
|
||||
equals_string: as:Image
|
||||
post_type_schema_org_type:
|
||||
equals_string: schema:ImageObject
|
||||
post_type_ephemeral:
|
||||
equals_expression: "false"
|
||||
post_type_supported_platforms:
|
||||
equals_string_in:
|
||||
- Instagram
|
||||
- Pinterest
|
||||
- Flickr
|
||||
- Facebook
|
||||
- XTwitter
|
||||
- LinkedIn
|
||||
post_type_media_formats:
|
||||
equals_string_in:
|
||||
- image/jpeg
|
||||
- image/png
|
||||
- image/webp
|
||||
- image/gif
|
||||
|
||||
comments:
|
||||
- "Core content type for visual heritage"
|
||||
- "Instagram dominant for art museums"
|
||||
- "Pinterest valuable for discovery"
|
||||
- "Flickr for high-resolution and CC licensing"
|
||||
|
||||
# ============================================================================
|
||||
# TEXT CATEGORY
|
||||
# Text-based posts (tweets, toots, LinkedIn posts)
|
||||
# ============================================================================
|
||||
|
||||
TextPostType:
|
||||
is_a: SocialMediaPostType
|
||||
class_uri: as:Note
|
||||
description: |
|
||||
Text-based social media posts, typically short-form.
|
||||
|
||||
**Activity Streams Mapping**: `as:Note`
|
||||
**Schema.org Mapping**: `schema:SocialMediaPosting`
|
||||
|
||||
**Platforms and Character Limits**:
|
||||
|
||||
| Platform | Character Limit | Notes |
|
||||
|----------|-----------------|-------|
|
||||
| X/Twitter | 280 (free), 4000 (premium) | Originally 140 |
|
||||
| Mastodon | 500 (configurable) | ActivityPub federation |
|
||||
| Bluesky | 300 | AT Protocol |
|
||||
| LinkedIn | 3000 | Longer-form text |
|
||||
| Facebook | 63,206 | Practically unlimited |
|
||||
| Threads | 500 | Instagram integration |
|
||||
|
||||
**Heritage Use Cases**:
|
||||
|
||||
| Use Case | Description | Example |
|
||||
|----------|-------------|---------|
|
||||
| Announcements | News and updates | "New exhibition opens Friday!" |
|
||||
| Event reminders | Upcoming activities | "Join us for #AskACurator" |
|
||||
| Facts and trivia | Collection knowledge | "This painting took 4 years..." |
|
||||
| Engagement | Questions and polls | "What's your favorite artwork?" |
|
||||
| Advocacy | Preservation awareness | Heritage at risk alerts |
|
||||
| Live updates | Real-time event coverage | Conference live-tweeting |
|
||||
|
||||
**Characteristics**:
|
||||
- May include attached media (images, videos)
|
||||
- Hashtag support for discovery
|
||||
- Mention/tagging for engagement
|
||||
- Link previews for URL sharing
|
||||
|
||||
exact_mappings:
|
||||
- as:Note
|
||||
|
||||
close_mappings:
|
||||
- schema:SocialMediaPosting
|
||||
|
||||
slot_usage:
|
||||
post_type_category:
|
||||
equals_string: TEXT
|
||||
post_type_activity_streams_type:
|
||||
equals_string: as:Note
|
||||
post_type_schema_org_type:
|
||||
equals_string: schema:SocialMediaPosting
|
||||
post_type_ephemeral:
|
||||
equals_expression: "false"
|
||||
post_type_supported_platforms:
|
||||
equals_string_in:
|
||||
- XTwitter
|
||||
- Mastodon
|
||||
- Bluesky
|
||||
- LinkedIn
|
||||
- Facebook
|
||||
- Threads
|
||||
|
||||
comments:
|
||||
- "Foundation of social media engagement"
|
||||
- "Mastodon/Bluesky growing as X alternatives"
|
||||
- "Often combined with images or links"
|
||||
- "Hashtags important for heritage campaigns"
|
||||
|
||||
# ============================================================================
|
||||
# STORY CATEGORY
|
||||
# Ephemeral content (24-hour visibility)
|
||||
# ============================================================================
|
||||
|
||||
StoryPostType:
|
||||
is_a: SocialMediaPostType
|
||||
class_uri: hc:Story
|
||||
description: |
|
||||
Ephemeral content that auto-deletes after 24 hours (typically).
|
||||
|
||||
**Activity Streams Mapping**: `as:Note` (with ephemeral flag)
|
||||
**Schema.org Mapping**: `schema:SocialMediaPosting`
|
||||
|
||||
**Platforms**:
|
||||
- Instagram Stories (most popular)
|
||||
- Facebook Stories
|
||||
- LinkedIn Stories (discontinued 2021)
|
||||
- Snapchat (original format)
|
||||
- YouTube Stories (discontinued 2023)
|
||||
|
||||
**Characteristics**:
|
||||
- Vertical format (9:16)
|
||||
- Auto-delete after 24 hours
|
||||
- Interactive elements (polls, questions, quizzes)
|
||||
- Stickers, GIFs, music overlays
|
||||
- Swipe-up links (for larger accounts)
|
||||
- Highlights: Saved stories that persist
|
||||
|
||||
**Heritage Use Cases**:
|
||||
|
||||
| Use Case | Description | Engagement |
|
||||
|----------|-------------|------------|
|
||||
| Daily updates | "Today at the museum" | Behind-the-scenes |
|
||||
| Event coverage | Real-time exhibition opening | Live feeling |
|
||||
| Polls/quizzes | "Guess the artist" | Interactive |
|
||||
| Countdowns | Exhibition launch timers | Anticipation |
|
||||
| Takeovers | Guest curator for a day | Fresh voice |
|
||||
| Q&A | "Ask a conservator" | Direct engagement |
|
||||
|
||||
**Technical Properties**:
|
||||
- Duration: 15 seconds per segment
|
||||
- Format: Vertical (1080x1920)
|
||||
- Can chain multiple segments
|
||||
- Mentions and hashtags supported
|
||||
|
||||
close_mappings:
|
||||
- as:Note
|
||||
- schema:SocialMediaPosting
|
||||
|
||||
slot_usage:
|
||||
post_type_category:
|
||||
equals_string: STORY
|
||||
post_type_activity_streams_type:
|
||||
equals_string: as:Note
|
||||
post_type_max_duration:
|
||||
equals_string: PT15S
|
||||
post_type_ephemeral:
|
||||
equals_expression: "true"
|
||||
post_type_supported_platforms:
|
||||
equals_string_in:
|
||||
- Instagram
|
||||
- Facebook
|
||||
- Snapchat
|
||||
|
||||
comments:
|
||||
- "Ephemeral content - auto-deletes after 24 hours"
|
||||
- "High engagement due to FOMO effect"
|
||||
- "Highlights feature preserves selected stories"
|
||||
- "Interactive stickers for engagement"
|
||||
|
||||
# ============================================================================
|
||||
# LIVE_STREAM CATEGORY
|
||||
# Real-time video broadcasting
|
||||
# ============================================================================
|
||||
|
||||
LiveStreamPostType:
|
||||
is_a: SocialMediaPostType
|
||||
class_uri: hc:LiveStream
|
||||
description: |
|
||||
Real-time video broadcasting with audience interaction.
|
||||
|
||||
**Activity Streams Mapping**: `as:Video` (with live flag)
|
||||
**Schema.org Mapping**: `schema:VideoObject` (with `isLiveBroadcast: true`)
|
||||
|
||||
**Platforms**:
|
||||
- YouTube Live
|
||||
- Instagram Live
|
||||
- Facebook Live
|
||||
- Twitch
|
||||
- LinkedIn Live
|
||||
- TikTok Live
|
||||
|
||||
**Characteristics**:
|
||||
- Real-time broadcasting
|
||||
- Live chat interaction
|
||||
- Can be archived as standard video
|
||||
- Notifications to followers
|
||||
- Multi-guest capabilities
|
||||
- Screen sharing (some platforms)
|
||||
|
||||
**Heritage Use Cases**:
|
||||
|
||||
| Use Case | Description | Interaction |
|
||||
|----------|-------------|-------------|
|
||||
| Exhibition openings | Virtual attendance | Live Q&A |
|
||||
| Curator talks | Gallery walkthroughs | Real-time questions |
|
||||
| Conservation | Live restoration work | Expert commentary |
|
||||
| Panel discussions | Multi-speaker events | Audience questions |
|
||||
| Behind-the-scenes | Storage tours | Exclusive access |
|
||||
| Collection reveals | New acquisition announcements | First look |
|
||||
|
||||
**Post-Broadcast**:
|
||||
- Most platforms archive as regular video
|
||||
- Can be edited and republished
|
||||
- Live chat preserved (some platforms)
|
||||
|
||||
close_mappings:
|
||||
- as:Video
|
||||
- schema:VideoObject
|
||||
|
||||
slot_usage:
|
||||
post_type_category:
|
||||
equals_string: LIVE_STREAM
|
||||
post_type_activity_streams_type:
|
||||
equals_string: as:Video
|
||||
post_type_schema_org_type:
|
||||
equals_string: schema:VideoObject
|
||||
post_type_ephemeral:
|
||||
equals_expression: "false"
|
||||
post_type_supported_platforms:
|
||||
equals_string_in:
|
||||
- YouTube
|
||||
- Instagram
|
||||
- Facebook
|
||||
- Twitch
|
||||
- LinkedIn
|
||||
- TikTok
|
||||
|
||||
comments:
|
||||
- "Real-time interaction with audience"
|
||||
- "Often archived as standard video after broadcast"
|
||||
- "YouTube and Facebook most common for heritage"
|
||||
- "Twitch for gaming/cultural crossover events"
|
||||
|
||||
# ============================================================================
|
||||
# AUDIO CATEGORY
|
||||
# Audio content including podcasts
|
||||
# ============================================================================
|
||||
|
||||
AudioPostType:
|
||||
is_a: SocialMediaPostType
|
||||
class_uri: as:Audio
|
||||
description: |
|
||||
Audio-only content including podcasts, music, and audio guides.
|
||||
|
||||
**Activity Streams Mapping**: `as:Audio`
|
||||
**Schema.org Mapping**: `schema:AudioObject`, `schema:PodcastEpisode`
|
||||
|
||||
**Platforms**:
|
||||
- Spotify (podcasts and music)
|
||||
- Apple Podcasts
|
||||
- SoundCloud
|
||||
- Audible
|
||||
- Stitcher
|
||||
- Google Podcasts (discontinued 2024)
|
||||
|
||||
**Content Types**:
|
||||
|
||||
| Type | Description | Typical Duration |
|
||||
|------|-------------|------------------|
|
||||
| Podcast episode | Regular series content | 20-60 min |
|
||||
| Audio guide | Exhibition companion | 30-90 min |
|
||||
| Oral history | Recorded interviews | 15-60 min |
|
||||
| Music/sound art | Audio artworks | Varies |
|
||||
| Audio description | Accessibility content | Per-item |
|
||||
|
||||
**Heritage Use Cases**:
|
||||
|
||||
| Use Case | Description | Distribution |
|
||||
|----------|-------------|--------------|
|
||||
| Museum podcasts | Collection stories, interviews | Spotify, Apple |
|
||||
| Audio guides | Self-guided tours | Institutional app |
|
||||
| Oral histories | Community voice recordings | SoundCloud, archive |
|
||||
| Accessibility | Description for blind visitors | Institutional |
|
||||
| Sound archives | Historical recordings | SoundCloud, Spotify |
|
||||
|
||||
**Metadata Captured**:
|
||||
- Duration
|
||||
- Episode number (for series)
|
||||
- Show/series name
|
||||
- Transcript availability
|
||||
- Guest information
|
||||
|
||||
exact_mappings:
|
||||
- as:Audio
|
||||
- schema:AudioObject
|
||||
|
||||
close_mappings:
|
||||
- schema:PodcastEpisode
|
||||
|
||||
slot_usage:
|
||||
post_type_category:
|
||||
equals_string: AUDIO
|
||||
post_type_activity_streams_type:
|
||||
equals_string: as:Audio
|
||||
post_type_schema_org_type:
|
||||
equals_string: schema:AudioObject
|
||||
post_type_ephemeral:
|
||||
equals_expression: "false"
|
||||
post_type_supported_platforms:
|
||||
equals_string_in:
|
||||
- Spotify
|
||||
- SoundCloud
|
||||
- ApplePodcasts
|
||||
- Audible
|
||||
post_type_media_formats:
|
||||
equals_string_in:
|
||||
- audio/mpeg
|
||||
- audio/mp4
|
||||
- audio/wav
|
||||
- audio/ogg
|
||||
|
||||
comments:
|
||||
- "Growing format for heritage storytelling"
|
||||
- "Podcasts excellent for long-form narratives"
|
||||
- "Audio guides extend museum experience"
|
||||
- "Oral histories preserve community voices"
|
||||
|
||||
# ============================================================================
|
||||
# ARTICLE CATEGORY
|
||||
# Long-form written content
|
||||
# ============================================================================
|
||||
|
||||
ArticlePostType:
|
||||
is_a: SocialMediaPostType
|
||||
class_uri: as:Article
|
||||
description: |
|
||||
Long-form written content including blog posts and newsletters.
|
||||
|
||||
**Activity Streams Mapping**: `as:Article`
|
||||
**Schema.org Mapping**: `schema:Article`, `schema:BlogPosting`
|
||||
|
||||
**Platforms**:
|
||||
- Medium
|
||||
- Substack
|
||||
- LinkedIn Articles
|
||||
- Institutional blogs
|
||||
- WordPress
|
||||
- Ghost
|
||||
|
||||
**Characteristics**:
|
||||
- Long-form text (1000+ words typical)
|
||||
- Rich formatting (headers, images, embeds)
|
||||
- SEO optimized
|
||||
- Newsletter distribution (Substack)
|
||||
- Comments and responses
|
||||
- Publication-style layout
|
||||
|
||||
**Heritage Use Cases**:
|
||||
|
||||
| Use Case | Description | Length |
|
||||
|----------|-------------|--------|
|
||||
| Collection deep-dives | In-depth object analysis | 2000-5000 words |
|
||||
| Research findings | Academic-style writeups | 3000-10000 words |
|
||||
| Conservation stories | Detailed restoration narratives | 1500-3000 words |
|
||||
| Exhibition essays | Curatorial perspectives | 2000-4000 words |
|
||||
| Newsletter updates | Regular subscriber content | 500-1500 words |
|
||||
| Behind-the-scenes | Long-form narratives | 1000-2000 words |
|
||||
|
||||
**Metadata Captured**:
|
||||
- Reading time
|
||||
- Word count
|
||||
- Publication date
|
||||
- Author/byline
|
||||
- Tags/topics
|
||||
- Featured image
|
||||
|
||||
exact_mappings:
|
||||
- as:Article
|
||||
- schema:Article
|
||||
|
||||
close_mappings:
|
||||
- schema:BlogPosting
|
||||
|
||||
slot_usage:
|
||||
post_type_category:
|
||||
equals_string: ARTICLE
|
||||
post_type_activity_streams_type:
|
||||
equals_string: as:Article
|
||||
post_type_schema_org_type:
|
||||
equals_string: schema:Article
|
||||
post_type_ephemeral:
|
||||
equals_expression: "false"
|
||||
post_type_supported_platforms:
|
||||
equals_string_in:
|
||||
- Medium
|
||||
- Substack
|
||||
- LinkedIn
|
||||
- WordPress
|
||||
|
||||
comments:
|
||||
- "Best for in-depth heritage storytelling"
|
||||
- "Medium popular for cultural content"
|
||||
- "Substack for newsletter-style distribution"
|
||||
- "LinkedIn Articles for professional audience"
|
||||
|
||||
# ============================================================================
|
||||
# THREAD CATEGORY
|
||||
# Multi-post sequences
|
||||
# ============================================================================
|
||||
|
||||
ThreadPostType:
|
||||
is_a: SocialMediaPostType
|
||||
class_uri: hc:Thread
|
||||
description: |
|
||||
Multi-post sequences forming a connected narrative.
|
||||
|
||||
**Activity Streams Mapping**: `as:Collection` of `as:Note`
|
||||
**Schema.org Mapping**: `schema:ItemList` of `schema:SocialMediaPosting`
|
||||
|
||||
**Platforms**:
|
||||
- X/Twitter (threads)
|
||||
- Mastodon (threads)
|
||||
- Bluesky (threads)
|
||||
- Threads by Meta
|
||||
|
||||
**Characteristics**:
|
||||
- Multiple connected posts
|
||||
- Sequential reading order
|
||||
- Often numbered (1/10, 2/10, etc.)
|
||||
- Reply-chain structure
|
||||
- Can be bookmarked/shared as unit
|
||||
- "Thread reader" apps for reading
|
||||
|
||||
**Heritage Use Cases**:
|
||||
|
||||
| Use Case | Description | Typical Length |
|
||||
|----------|-------------|----------------|
|
||||
| Object stories | Multi-part artifact narratives | 5-15 posts |
|
||||
| Exhibition walkthroughs | Room-by-room descriptions | 10-20 posts |
|
||||
| Historical timelines | Chronological storytelling | 10-30 posts |
|
||||
| Conservation process | Step-by-step documentation | 5-10 posts |
|
||||
| Artist biographies | Life story in segments | 10-15 posts |
|
||||
| Collection highlights | "Top 10" style series | 10-12 posts |
|
||||
|
||||
**Engagement Benefits**:
|
||||
- Higher engagement than single posts
|
||||
- Encourages following for completion
|
||||
- Easily shared as complete unit
|
||||
- Thread unroller tools for reading
|
||||
|
||||
close_mappings:
|
||||
- as:Collection
|
||||
- schema:ItemList
|
||||
|
||||
slot_usage:
|
||||
post_type_category:
|
||||
equals_string: THREAD
|
||||
post_type_activity_streams_type:
|
||||
equals_string: as:Collection
|
||||
post_type_ephemeral:
|
||||
equals_expression: "false"
|
||||
post_type_supported_platforms:
|
||||
equals_string_in:
|
||||
- XTwitter
|
||||
- Mastodon
|
||||
- Bluesky
|
||||
- Threads
|
||||
|
||||
comments:
|
||||
- "Popular format for heritage storytelling"
|
||||
- "Overcomes character limits creatively"
|
||||
- "#MuseumWeek and similar campaigns use threads"
|
||||
- "Thread reader tools compile into articles"
|
||||
|
||||
# ============================================================================
|
||||
# CAROUSEL CATEGORY
|
||||
# Multi-media collections in single post
|
||||
# ============================================================================
|
||||
|
||||
CarouselPostType:
|
||||
is_a: SocialMediaPostType
|
||||
class_uri: hc:Carousel
|
||||
description: |
|
||||
Multi-image or multi-video posts in a swipeable format.
|
||||
|
||||
**Activity Streams Mapping**: `as:Collection` of `as:Image` / `as:Video`
|
||||
**Schema.org Mapping**: `schema:ImageGallery`
|
||||
|
||||
**Platforms and Limits**:
|
||||
|
||||
| Platform | Max Items | Media Types |
|
||||
|----------|-----------|-------------|
|
||||
| Instagram | 10 | Images, Videos, Mixed |
|
||||
| LinkedIn | 20 | Images only |
|
||||
| Facebook | 10 | Images, Videos |
|
||||
| X/Twitter | 4 | Images only |
|
||||
|
||||
**Characteristics**:
|
||||
- Swipeable/scrollable format
|
||||
- Mixed media (images + videos)
|
||||
- Single caption for all items
|
||||
- Individual alt text per item
|
||||
- Higher engagement than single images
|
||||
|
||||
**Heritage Use Cases**:
|
||||
|
||||
| Use Case | Description | Typical Items |
|
||||
|----------|-------------|---------------|
|
||||
| Object details | Multiple angles of artifact | 3-5 images |
|
||||
| Before/after | Conservation transformation | 2-4 images |
|
||||
| Exhibition preview | Multiple room shots | 5-10 images |
|
||||
| Collection series | Related objects grouped | 5-10 images |
|
||||
| Infographic series | Multi-part educational | 5-10 images |
|
||||
| Event recap | Photo collection from event | 8-10 images |
|
||||
|
||||
**Engagement Benefits**:
|
||||
- Longer time on post
|
||||
- Multiple opportunities to engage
|
||||
- Story-like sequential viewing
|
||||
- Higher save rates
|
||||
|
||||
close_mappings:
|
||||
- as:Collection
|
||||
- schema:ImageGallery
|
||||
|
||||
slot_usage:
|
||||
post_type_category:
|
||||
equals_string: CAROUSEL
|
||||
post_type_activity_streams_type:
|
||||
equals_string: as:Collection
|
||||
post_type_schema_org_type:
|
||||
equals_string: schema:ImageGallery
|
||||
post_type_ephemeral:
|
||||
equals_expression: "false"
|
||||
post_type_supported_platforms:
|
||||
equals_string_in:
|
||||
- Instagram
|
||||
- LinkedIn
|
||||
- Facebook
|
||||
- XTwitter
|
||||
|
||||
comments:
|
||||
- "Excellent for detailed collection storytelling"
|
||||
- "Instagram carousels have highest engagement"
|
||||
- "Good for before/after conservation"
|
||||
- "LinkedIn carousels popular for professional content"
|
||||
|
||||
# ============================================================================
|
||||
# OTHER CATEGORY
|
||||
# Fallback for emerging formats
|
||||
# ============================================================================
|
||||
|
||||
OtherPostType:
|
||||
is_a: SocialMediaPostType
|
||||
class_uri: as:Object
|
||||
description: |
|
||||
Fallback type for emerging or uncategorized content formats.
|
||||
|
||||
**Activity Streams Mapping**: `as:Object` (generic)
|
||||
**Schema.org Mapping**: `schema:MediaObject`
|
||||
|
||||
**Use Cases**:
|
||||
- New platform features not yet classified
|
||||
- Experimental content formats
|
||||
- Platform-specific content without standard mapping
|
||||
- Mixed or hybrid formats
|
||||
|
||||
**Examples of Emerging Formats**:
|
||||
- AR/VR experiences
|
||||
- Interactive polls as standalone content
|
||||
- NFT-linked content
|
||||
- AI-generated content
|
||||
- 360° photos
|
||||
- Spatial audio
|
||||
|
||||
**When to Use**:
|
||||
Use OtherPostType when content doesn't fit existing categories.
|
||||
Document the specific format in post description for future
|
||||
classification review.
|
||||
|
||||
close_mappings:
|
||||
- as:Object
|
||||
- schema:MediaObject
|
||||
|
||||
slot_usage:
|
||||
post_type_category:
|
||||
equals_string: OTHER
|
||||
post_type_activity_streams_type:
|
||||
equals_string: as:Object
|
||||
post_type_schema_org_type:
|
||||
equals_string: schema:MediaObject
|
||||
post_type_ephemeral:
|
||||
equals_expression: "false"
|
||||
|
||||
comments:
|
||||
- "Fallback for content not matching other types"
|
||||
- "Document specific format for future classification"
|
||||
- "Review periodically for new category creation"
|
||||
- "Use sparingly - prefer specific types when possible"
|
||||
Loading…
Reference in a new issue