diff --git a/schemas/20251121/linkml/modules/classes/SocialMediaContent.yaml b/schemas/20251121/linkml/modules/classes/SocialMediaContent.yaml new file mode 100644 index 0000000000..a850feb694 --- /dev/null +++ b/schemas/20251121/linkml/modules/classes/SocialMediaContent.yaml @@ -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 diff --git a/schemas/20251121/linkml/modules/classes/SocialMediaPost.yaml b/schemas/20251121/linkml/modules/classes/SocialMediaPost.yaml new file mode 100644 index 0000000000..d7a35ceb86 --- /dev/null +++ b/schemas/20251121/linkml/modules/classes/SocialMediaPost.yaml @@ -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 diff --git a/schemas/20251121/linkml/modules/classes/SocialMediaPostType.yaml b/schemas/20251121/linkml/modules/classes/SocialMediaPostType.yaml new file mode 100644 index 0000000000..ae1710cc8b --- /dev/null +++ b/schemas/20251121/linkml/modules/classes/SocialMediaPostType.yaml @@ -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. diff --git a/schemas/20251121/linkml/modules/classes/SocialMediaPostTypes.yaml b/schemas/20251121/linkml/modules/classes/SocialMediaPostTypes.yaml new file mode 100644 index 0000000000..d95f2a46c5 --- /dev/null +++ b/schemas/20251121/linkml/modules/classes/SocialMediaPostTypes.yaml @@ -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"