nostr:npub1zafcms4xya5ap9zr7xxr0jlrtrattwlesytn2s42030lzu0dwlzqpd26k5 look what I did fren

vibed out

Reply to this note

Please Login to reply.

Discussion

Whats the spec? Which NIP?

idk it’s all in the documentation of https://watchparty-nostr.shakespeare.wtf

But idk how to find that lol

cc: nostr:npub1hee433872q2gen90cqh2ypwcq9z7y5ugn23etrd2l2rrwpruss8qwmrsv6 nostr:npub18ams6ewn5aj2n3wt2qawzglx9mr4nzksxhvrdc4gzrecw7n5tvjqctp424 nostr:npub1q3sle0kvfsehgsuexttt3ugjd8xdklxfwwkh559wxckmzddywnws6cd26p

I found this in the code

# NIP: Watch Party Implementation

This document describes how this application implements watch parties using NIP-53 (Live Activities).

## Event Kinds

This application uses the following standard NIP-53 event kinds:

### Kind 30311: Live Event (Watch Party)

Used to create and manage watch parties. This is an addressable event that represents a live streaming/watch party session.

**Required Tags:**

- `d`: Unique identifier for the watch party

- `title`: Name of the watch party

- `streaming`: URL to the video/stream to watch

- `status`: Current status (`planned`, `live`, or `ended`)

- `starts`: Unix timestamp when the watch party started/will start

- `p`: Host's pubkey with role "Host"

**Optional Tags:**

- `summary`: Description of the watch party

- `image`: Thumbnail/preview image URL

- `t`: Hashtags for categorization

- `current_participants`: Number of currently active participants

- `total_participants`: Total number of participants who joined

- `ends`: Unix timestamp when the watch party ended/will end

**Example:**

```json

{

"kind": 30311,

"tags": [

["d", "wp-1702234567890-abc123"],

["title", "Movie Night: The Matrix"],

["summary", "Join us for a classic sci-fi movie night!"],

["streaming", "https://youtube.com/watch?v=example"],

["image", ""],

["status", "live"],

["starts", "1702234567"],

["p", "host-pubkey-hex", "", "Host"],

["t", "movies"],

["t", "scifi"]

],

"content": ""

}

```

### Kind 1311: Live Chat Message

Used for chat messages within a watch party. Each message references the parent watch party event.

**Required Tags:**

- `a`: Coordinate to the parent watch party event (format: `30311:pubkey:d-tag`, with `root` marker)

**Optional Tags:**

- `e`: Event ID of a message being replied to

**Example:**

```json

{

"kind": 1311,

"tags": [

["a", "30311:host-pubkey:wp-1702234567890-abc123", "", "root"]

],

"content": "This movie is amazing! 🍿"

}

```

## Marathons (24/7 Series Streaming)

Marathons are continuous 24/7 watch parties for series collections with 7+ episodes. They enable synchronized viewing of entire series in order with automatic looping.

### Marathon Event Structure

Marathons use the same kind 30311 (Live Event) but with additional metadata:

**Required Tags:**

- All standard kind 30311 tags

- Multiple `streaming` tags, one per episode with optional episode label

- `t` tag with value "marathon" to identify marathon events

- `content` field containing playlist JSON

**Content Field JSON:**

```json

{

"episodes": [

{"episode": 1, "url": "https://..."},

{"episode": 2, "url": "https://..."}

],

"currentEpisode": 0,

"loop": true

}

```

**Example Marathon Event:**

```json

{

"kind": 30311,

"content": "{\"episodes\":[{\"episode\":1,\"url\":\"https://archive.org/ep1\"},{\"episode\":2,\"url\":\"https://archive.org/ep2\"}],\"currentEpisode\":0,\"loop\":true}",

"tags": [

["d", "marathon-abc123"],

["title", "Cowboy Bebop Marathon"],

["summary", "24/7 marathon - 26 episodes playing in order"],

["streaming", "https://archive.org/ep1", "Episode 1"],

["streaming", "https://archive.org/ep2", "Episode 2"],

["status", "live"],

["t", "marathon"],

["t", "kinostr"],

["e", "original-series-post-id", "", "mention"]

]

}

```

### Marathon Features

- **Episode Navigation**: Users can skip forward/backward or jump to any episode

- **Continuous Playback**: Episodes play in sequence with automatic progression

- **24/7 Looping**: Series loops continuously for always-on viewing

- **Synchronized Viewing**: All participants watch the same episode together

- **Minimum 7 Episodes**: Only series with 7+ episodes qualify for marathons

### Series Detection

Series are automatically detected from kind 1 events containing 7+ video URLs. Each URL represents an episode in the series.

## Movie Libraries

This application includes a feature to browse movie collections curated by Nostr users. The implementation:

1. **Curator Discovery**: Users can browse featured curators or add custom curators by npub

2. **Movie Extraction**: Automatically extracts movie links from kind 1 (text notes) events

3. **Supported Platforms**: Archive.org, YouTube, Vimeo, and direct video links

4. **Quick Watch Parties**: Users can create watch parties directly from any movie in a library

5. **Attribution**: Watch parties created from library movies include an `e` tag referencing the original post

### Movie Detection

The application scans kind 1 events for URLs matching:

- `archive.org` domains

- YouTube URLs (`youtube.com`, `youtu.be`)

- Vimeo URLs (`vimeo.com`)

- Direct video files (`.mp4`, `.webm`, `.ogg`, `.m3u8`)

### Watch Party Tags for Library Movies

When creating a watch party from a library movie, additional tags are added:

```json

{

"kind": 30311,

"tags": [

["d", "unique-identifier"],

["title", "Movie Title"],

["streaming", "movie-url"],

["e", "original-post-event-id", "", "mention"],

["t", "kinostr"]

]

}

```

The `e` tag references the original movie post, and the `kinostr` tag categorizes it as movie-related content.

## Implementation Notes

### Video Platform Support

The video player component supports embedding from:

- YouTube (youtube.com, youtu.be)

- Vimeo (vimeo.com)

- Twitch (twitch.tv)

- Direct video files (.mp4, .webm, .ogg, .m3u8)

- Generic iframe embeds for other platforms

### Real-time Updates

- Watch party list refreshes every 30 seconds to show new parties and status changes

- Chat messages refresh every 5 seconds to show new messages

- Auto-scroll to bottom when new chat messages arrive

### Anonymous Viewing

Users can view watch parties and read chat without logging in. Authentication is only required to:

- Create a watch party

- Send chat messages

### NIP-19 Identifiers

Watch parties are identified using `naddr` (addressable event coordinates) which includes:

- Kind: 30311

- Pubkey: Host's public key

- Identifier: The `d` tag value

Format: `/watch/naddr1...`

## Zap Splits (NIP-57)

This application implements automatic zap splits to reward content curators when their movies or series are used in watch parties.

### Split Configuration

When a watch party is created from a library movie or series:

- **Host (Watch Party Creator)**: 70% of zaps

- **Curator (Original Content Poster)**: 30% of zaps

### Implementation

Watch parties created from library content include `zap` tags following NIP-57:

```json

{

"kind": 30311,

"tags": [

["zap", "host-pubkey-hex", "", "70"],

["zap", "curator-pubkey-hex", "", "30"],

["e", "original-post-event-id", "", "mention"]

]

}

```

### User Interface

- **Creation Dialogs**: Show zap split information before creating

- **Watch Party Page**: Display zap split recipients and percentages in sidebar

- **Transparency**: Users can see exactly how their zaps will be distributed

### Benefits

- **Curator Rewards**: Content curators earn passive income when their collections are used

- **Content Discovery**: Incentivizes high-quality content curation

- **Fair Distribution**: Hosts create the experience, curators provide the content

- **Automated**: Splits happen automatically through NIP-57 protocol

## Compliance

This implementation fully complies with:

- **NIP-53**: Live Activities specification

- **NIP-57**: Lightning Zaps with split payments

- **NIP-01**: Basic protocol flow

- **NIP-19**: bech32-encoded entity identifiers

nostr:npub1xtscya34g58tk0z605fvr788k263gsu6cy9x0mhnm87echrgufzsevkk5s πŸ‘€πŸ€ pls sir

πŸ”₯ stuff!

Thank you! Got some more wild ideas I wanna try out πŸ”₯🫑