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
125 lines
3.5 KiB
Go
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
|
|
} |