The Marathon has begun

Another first 🀝

nostr:naddr1qqwk6ctjv96xsmmw95cnwd3kxqurgd3nxcmnwdpdxdjkjvr5vypzpup098ryp73kqx47wecyd2y7ceuyup3unrws4sdrhy8g4cl8sljsqvzqqqrkvughyj2d

Reply to this note

Please Login to reply.

Discussion

nostr:npub1zafcms4xya5ap9zr7xxr0jlrtrattwlesytn2s42030lzu0dwlzqpd26k5 look what I did fren

vibed out

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 πŸ”₯🫑

Noice πŸ€™

i played the first episode in its entirety and it worked really well, never started episode 2 tho

Member Cytube? I member! I wrote a clone of it few years ago, but am too lazy to maintain it. This is very similar tho. I would pick it up again and Nostrify it. If I wasn't lazy. And I am. Lazy.

https://github.com/0x80085/synk

Lazy ? No prob.

Use https://shakespeare.diy

Might be worth a shot. what that Shakespeare do to a existing project tho.

nostr:npub1hee433872q2gen90cqh2ypwcq9z7y5ugn23etrd2l2rrwpruss8qwmrsv6 can answer any questions, I haven’t tried existing projects yet

Well I might just give it a try when I have some time on my hands, just for the heck of it. I really like the blossom and Nostr parts of your take on the watchparty idea.

However moderating the rooms, allow vote based skipping, leader assignment and it's edge cases like leader inactivity/disconnection etc. were the most annoying parts (also why I gave up)

Nostr login would take much of the user account storing it of my hands. Blossom would allow extra advertisement-less media source, which could be huge plusses

You can import projects too if you have the git repo or zip file

https://shakespeare.diy/clone

Interesting. Maybe I should let it loose on the codebase and see what happens πŸ€”

Also awesome project space cowboy! πŸ€™