enki 76979d055b
Some checks are pending
CI Pipeline / Run Tests (push) Waiting to run
CI Pipeline / Lint Code (push) Waiting to run
CI Pipeline / Security Scan (push) Waiting to run
CI Pipeline / Build Docker Images (push) Blocked by required conditions
CI Pipeline / E2E Tests (push) Blocked by required conditions
Transcoding and Nip71 update
2025-08-21 19:32:26 -07:00

125 lines
3.5 KiB
Go

package nostr
import (
"fmt"
"time"
"github.com/nbd-wtf/go-nostr"
)
const (
// NIP-71: Video Events
KindVideoHorizontal = 21
KindVideoVertical = 22
)
// CreateNIP71VideoEvent creates a NIP-71 video event with WebTorrent extensions
func (p *Publisher) CreateNIP71VideoEvent(data TorrentEventData) (*nostr.Event, error) {
// Determine if vertical video based on dimensions
kind := KindVideoHorizontal
if data.VideoHeight > data.VideoWidth {
kind = KindVideoVertical
}
event := &nostr.Event{
Kind: kind,
CreatedAt: nostr.Now(),
Content: data.Description,
Tags: nostr.Tags{},
}
// Standard NIP-71 tags
if data.Title != "" {
event.Tags = event.Tags.AppendUnique(nostr.Tag{"title", data.Title})
}
event.Tags = event.Tags.AppendUnique(nostr.Tag{"published_at", fmt.Sprintf("%d", time.Now().Unix())})
if data.Description != "" {
event.Tags = event.Tags.AppendUnique(nostr.Tag{"alt", data.Description})
}
// Duration in seconds
if data.Duration > 0 {
event.Tags = event.Tags.AppendUnique(nostr.Tag{"duration", fmt.Sprintf("%d", data.Duration)})
}
// Add HLS streaming URL
if data.HLSPlaylistURL != "" {
event.Tags = event.Tags.AppendUnique(nostr.Tag{
"imeta",
fmt.Sprintf("dim %dx%d", data.VideoWidth, data.VideoHeight),
fmt.Sprintf("url %s", data.HLSPlaylistURL),
"m application/x-mpegURL",
})
}
// Add direct download URL
if data.StreamURL != "" {
event.Tags = event.Tags.AppendUnique(nostr.Tag{
"imeta",
fmt.Sprintf("dim %dx%d", data.VideoWidth, data.VideoHeight),
fmt.Sprintf("url %s", data.StreamURL),
fmt.Sprintf("m %s", data.MimeType),
fmt.Sprintf("size %d", data.FileSize),
})
}
// Add WebTorrent magnet link
if data.MagnetLink != "" {
event.Tags = event.Tags.AppendUnique(nostr.Tag{"magnet", data.MagnetLink})
// WebTorrent extensions
event.Tags = event.Tags.AppendUnique(nostr.Tag{"webtorrent", data.MagnetLink})
event.Tags = event.Tags.AppendUnique(nostr.Tag{"streaming_method", "webtorrent"})
event.Tags = event.Tags.AppendUnique(nostr.Tag{"piece_order", "sequential"})
}
// Add WebSocket trackers for WebTorrent
wsTrackers := []string{
"wss://tracker.btorrent.xyz",
"wss://tracker.openwebtorrent.com",
"wss://tracker.webtorrent.dev",
}
for _, tracker := range wsTrackers {
event.Tags = event.Tags.AppendUnique(nostr.Tag{"ws_tracker", tracker})
}
// Add WebSeed fallback
if data.WebSeedURL != "" {
event.Tags = event.Tags.AppendUnique(nostr.Tag{"webseed", data.WebSeedURL})
}
// Cross-reference with NIP-35 torrent
if data.InfoHash != "" {
event.Tags = event.Tags.AppendUnique(nostr.Tag{"i", data.InfoHash})
}
// Blossom reference
if data.BlossomHash != "" {
event.Tags = event.Tags.AppendUnique(nostr.Tag{"blossom", data.BlossomHash})
}
// Content categorization
event.Tags = event.Tags.AppendUnique(nostr.Tag{"t", "video"})
event.Tags = event.Tags.AppendUnique(nostr.Tag{"t", "p2p"})
event.Tags = event.Tags.AppendUnique(nostr.Tag{"t", "webtorrent"})
event.Tags = event.Tags.AppendUnique(nostr.Tag{"t", "streaming"})
// Quality tags
if data.VideoHeight >= 2160 {
event.Tags = event.Tags.AppendUnique(nostr.Tag{"t", "4k"})
} else if data.VideoHeight >= 1080 {
event.Tags = event.Tags.AppendUnique(nostr.Tag{"t", "hd"})
} else if data.VideoHeight >= 720 {
event.Tags = event.Tags.AppendUnique(nostr.Tag{"t", "hd"})
}
// Sign the event
err := event.Sign(p.privateKey)
if err != nil {
return nil, fmt.Errorf("error signing NIP-71 event: %w", err)
}
return event, nil
}