From 13c44f731ab2129271d5f4282f53bc8565fa0e93 Mon Sep 17 00:00:00 2001 From: KeelrLeek <156356974+KeelrLeek@users.noreply.github.com> Date: Wed, 2 Sep 2026 15:02:06 -0500 Subject: [PATCH] community: shared playlists, a signed revision and a pointer on the network, a reference over soulseek, an import through the normal door --- crates/persona-state/src/lib.rs | 1 + crates/persona-state/src/playlist.rs | 342 +++++++++++ .../assets/playlist_pointer_contract.wasm | Bin 0 -> 177666 bytes .../assets/playlist_revision_contract.wasm | Bin 0 -> 190226 bytes src-tauri/src/commands.rs | 1 + src-tauri/src/lib.rs | 9 + src-tauri/src/shared_playlists.rs | 554 ++++++++++++++++++ src/lib/api.js | 8 + src/lib/community.svelte.js | 74 ++- src/views/Community.svelte | 64 +- src/views/Playlist.svelte | 116 ++++ 11 files changed, 1166 insertions(+), 3 deletions(-) create mode 100644 crates/persona-state/src/playlist.rs create mode 100644 src-tauri/assets/playlist_pointer_contract.wasm create mode 100644 src-tauri/assets/playlist_revision_contract.wasm create mode 100644 src-tauri/src/shared_playlists.rs diff --git a/crates/persona-state/src/lib.rs b/crates/persona-state/src/lib.rs index 749f9db..9185139 100644 --- a/crates/persona-state/src/lib.rs +++ b/crates/persona-state/src/lib.rs @@ -17,6 +17,7 @@ use serde::{Deserialize, Serialize}; pub mod slsk_link; pub mod friend; +pub mod playlist; pub const SCHEMA_VERSION: u32 = 1; pub const SIGN_DOMAIN: &str = "soulstream.profile/v1"; diff --git a/crates/persona-state/src/playlist.rs b/crates/persona-state/src/playlist.rs new file mode 100644 index 0000000..57dfa3f --- /dev/null +++ b/crates/persona-state/src/playlist.rs @@ -0,0 +1,342 @@ +//! Playlist publication — F3's exact shapes: an immutable, content-addressed +//! revision (the portable manifest: entry occurrences with recording ids and +//! display fallbacks, never a path) and an owner-signed pointer to the +//! current revision per (owner, playlist uuid). BYTE-COMPATIBILITY IS THE +//! CONTRACT: both shapes are what the bundled revision/pointer wasm validate +//! (built from research/freenet-f3, code hashes pinned by the app's tests). +//! +//! Signing: the delegate caps payloads, so what it signs is blake3(sig-body) +//! under `soulstream.playlist/v1` — the F3 convention, mirrored here. + +use serde::{Deserialize, Serialize}; + +pub const SIGN_DOMAIN: &str = "soulstream.playlist/v1"; +pub const SCHEMA_VERSION: u32 = 1; +pub const REV_PARAMS_FAMILY: &[u8] = b"soulstream.playlist-rev.v1"; +pub const PTR_PARAMS_FAMILY: &[u8] = b"soulstream.playlist-ptr.v1"; +pub const MAX_MANIFEST_BYTES: usize = 2 * 1024 * 1024; +pub const MAX_ENTRIES: usize = 5000; +pub const MAX_NAME_BYTES: usize = 128; +pub const MAX_DESC_BYTES: usize = 2048; +pub const MAX_NOTE_BYTES: usize = 280; +pub const MAX_FIELD_BYTES: usize = 512; +pub const MAX_POINTER_BYTES: usize = 1024; + +// ------------------------------------------------------------ manifest + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct RecordingRef { + pub musicbrainz_recording_id: Option, + pub isrcs: Vec, + pub deezer_id: Option, + pub apple_music_id: Option, + pub title: String, + pub artists: Vec, + pub album: String, + pub duration_ms: Option, + pub release_year: Option, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct EntryV1 { + /// Occurrence id — duplicates of the same recording stay distinct. + pub entry_id: [u8; 16], + pub position: u32, + pub recording: RecordingRef, + pub note: Option, + /// Free-text resolution hint ("artist title"), NEVER a remote path. + pub slsk_hint: Option, +} + +/// Bounded artwork REFERENCE — hash + type + size only, no bytes. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct ArtworkRef { + pub content_hash: [u8; 32], + pub media_type: String, + pub byte_length: u32, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct ManifestV1 { + pub schema_version: u32, + pub owner: [u8; 32], + pub playlist_uuid: [u8; 16], + pub revision_seq: u64, + /// Previous revision's content hash, None for the first. + pub prev_revision_hash: Option<[u8; 32]>, + pub name: String, + pub description: String, + pub artwork: Option, + pub entries: Vec, + pub sig: Vec, +} + +#[derive(Serialize)] +struct ManifestSigBody<'a> { + schema_version: u32, + owner: &'a [u8; 32], + playlist_uuid: &'a [u8; 16], + revision_seq: u64, + prev_revision_hash: &'a Option<[u8; 32]>, + name: &'a str, + description: &'a str, + artwork: &'a Option, + entries: &'a [EntryV1], +} + +/// The 32 bytes the delegate signs: blake3 of the serialized sig body. +pub fn manifest_sign_payload(m: &ManifestV1) -> Vec { + let body = bincode::serialize(&ManifestSigBody { + schema_version: m.schema_version, + owner: &m.owner, + playlist_uuid: &m.playlist_uuid, + revision_seq: m.revision_seq, + prev_revision_hash: &m.prev_revision_hash, + name: &m.name, + description: &m.description, + artwork: &m.artwork, + entries: &m.entries, + }) + .expect("sig body serializes"); + blake3::hash(&body).as_bytes().to_vec() +} + +fn verify(owner: &[u8; 32], payload: &[u8], sig: &[u8]) -> bool { + crate::verify_sig_in(SIGN_DOMAIN, owner, payload, sig) +} + +#[derive(Debug, PartialEq, Eq)] +pub enum Invalid { + Oversized(usize), + HashMismatch, + Malformed, + WrongSchema(u32), + WrongOwner, + TooManyEntries(usize), + FieldTooLong(&'static str, usize), + BadSignature, +} + +impl core::fmt::Display for Invalid { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + Invalid::Oversized(n) => write!(f, "{n} bytes is over the cap"), + Invalid::HashMismatch => write!(f, "bytes do not hash to their address"), + Invalid::Malformed => write!(f, "bytes do not parse"), + Invalid::WrongSchema(v) => write!(f, "unknown schema {v}"), + Invalid::WrongOwner => write!(f, "owner differs from the address"), + Invalid::TooManyEntries(n) => write!(f, "{n} entries is over the cap"), + Invalid::FieldTooLong(w, n) => write!(f, "{w} is {n} bytes, over its cap"), + Invalid::BadSignature => write!(f, "owner signature does not verify"), + } + } +} + +pub fn make_rev_params(owner: &[u8; 32], content_hash: &[u8; 32]) -> Vec { + let mut p = Vec::with_capacity(REV_PARAMS_FAMILY.len() + 64); + p.extend_from_slice(REV_PARAMS_FAMILY); + p.extend_from_slice(owner); + p.extend_from_slice(content_hash); + p +} + +/// Strict verification in the plan's order: size → content hash → parse → +/// schema → owner → caps → signature. All BEFORE any preview use. +pub fn validate_revision( + owner: &[u8; 32], + content_hash: &[u8; 32], + bytes: &[u8], +) -> Result { + if bytes.len() > MAX_MANIFEST_BYTES { + return Err(Invalid::Oversized(bytes.len())); + } + if blake3::hash(bytes).as_bytes() != content_hash { + return Err(Invalid::HashMismatch); + } + let m: ManifestV1 = bincode::deserialize(bytes).map_err(|_| Invalid::Malformed)?; + if m.schema_version != SCHEMA_VERSION { + return Err(Invalid::WrongSchema(m.schema_version)); + } + if &m.owner != owner { + return Err(Invalid::WrongOwner); + } + if m.entries.len() > MAX_ENTRIES { + return Err(Invalid::TooManyEntries(m.entries.len())); + } + if m.name.len() > MAX_NAME_BYTES { + return Err(Invalid::FieldTooLong("name", m.name.len())); + } + if m.description.len() > MAX_DESC_BYTES { + return Err(Invalid::FieldTooLong("description", m.description.len())); + } + for e in &m.entries { + if e.note.as_deref().map(str::len).unwrap_or(0) > MAX_NOTE_BYTES { + return Err(Invalid::FieldTooLong("note", e.note.as_ref().unwrap().len())); + } + for s in [&e.recording.title, &e.recording.album] { + if s.len() > MAX_FIELD_BYTES { + return Err(Invalid::FieldTooLong("recording field", s.len())); + } + } + if e.slsk_hint.as_deref().map(str::len).unwrap_or(0) > MAX_FIELD_BYTES { + return Err(Invalid::FieldTooLong("slsk_hint", e.slsk_hint.as_ref().unwrap().len())); + } + } + if !verify(owner, &manifest_sign_payload(&m), &m.sig) { + return Err(Invalid::BadSignature); + } + Ok(m) +} + +// ------------------------------------------------------------ pointer + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct RevisionRef { + pub content_hash: [u8; 32], + pub revision_seq: u64, + pub entry_count: u32, + pub byte_length: u32, + pub name: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct PointerState { + pub schema_version: u32, + pub owner: [u8; 32], + pub playlist_uuid: [u8; 16], + pub sequence: u64, + /// None + withdrawn = "removed from current state" — old revisions + /// remain fetchable; never claim network erasure. + pub current: Option, + pub withdrawn: bool, + pub sig: Vec, +} + +#[derive(Serialize)] +struct PointerSigBody<'a> { + schema_version: u32, + owner: &'a [u8; 32], + playlist_uuid: &'a [u8; 16], + sequence: u64, + current: &'a Option, + withdrawn: bool, +} + +pub fn pointer_sign_payload(p: &PointerState) -> Vec { + let body = bincode::serialize(&PointerSigBody { + schema_version: p.schema_version, + owner: &p.owner, + playlist_uuid: &p.playlist_uuid, + sequence: p.sequence, + current: &p.current, + withdrawn: p.withdrawn, + }) + .expect("sig body serializes"); + blake3::hash(&body).as_bytes().to_vec() +} + +pub fn make_ptr_params(owner: &[u8; 32], playlist_uuid: &[u8; 16]) -> Vec { + let mut p = Vec::with_capacity(PTR_PARAMS_FAMILY.len() + 48); + p.extend_from_slice(PTR_PARAMS_FAMILY); + p.extend_from_slice(owner); + p.extend_from_slice(playlist_uuid); + p +} + +pub fn validate_pointer( + owner: &[u8; 32], + uuid: &[u8; 16], + bytes: &[u8], +) -> Result { + if bytes.len() > MAX_POINTER_BYTES { + return Err(Invalid::Oversized(bytes.len())); + } + let p: PointerState = bincode::deserialize(bytes).map_err(|_| Invalid::Malformed)?; + if p.schema_version != SCHEMA_VERSION { + return Err(Invalid::WrongSchema(p.schema_version)); + } + if &p.owner != owner || &p.playlist_uuid != uuid { + return Err(Invalid::WrongOwner); + } + if let Some(r) = &p.current { + if r.name.len() > MAX_NAME_BYTES { + return Err(Invalid::FieldTooLong("pointer name", r.name.len())); + } + } + if !verify(owner, &pointer_sign_payload(&p), &p.sig) { + return Err(Invalid::BadSignature); + } + Ok(p) +} + +#[cfg(test)] +mod tests { + use super::*; + use ed25519_dalek::{Signer, SigningKey}; + + fn sign(key: &SigningKey, payload: &[u8]) -> Vec { + key.sign(&crate::signable(SIGN_DOMAIN, payload)).to_bytes().to_vec() + } + + #[test] + fn a_revision_and_its_pointer_round_trip_and_refuse_tampering() { + let key = SigningKey::from_bytes(&[5u8; 32]); + let owner = key.verifying_key().to_bytes(); + let mut m = ManifestV1 { + schema_version: SCHEMA_VERSION, + owner, + playlist_uuid: [9; 16], + revision_seq: 1, + prev_revision_hash: None, + name: "Rainy Window".into(), + description: "long fades".into(), + artwork: None, + entries: vec![EntryV1 { + entry_id: [1; 16], + position: 0, + recording: RecordingRef { + musicbrainz_recording_id: None, + isrcs: vec![], + deezer_id: None, + apple_music_id: None, + title: "Airbag".into(), + artists: vec!["Radiohead".into()], + album: "OK Computer".into(), + duration_ms: Some(284_000), + release_year: Some(1997), + }, + note: None, + slsk_hint: Some("radiohead airbag".into()), + }], + sig: vec![], + }; + m.sig = sign(&key, &manifest_sign_payload(&m)); + let bytes = bincode::serialize(&m).unwrap(); + let hash = *blake3::hash(&bytes).as_bytes(); + assert_eq!(validate_revision(&owner, &hash, &bytes).unwrap(), m); + // content addressing: a flipped byte trips the hash BEFORE parse + let mut flipped = bytes.clone(); + flipped[10] ^= 1; + assert_eq!(validate_revision(&owner, &hash, &flipped), Err(Invalid::HashMismatch)); + // a re-signed edit by the wrong key is a bad signature + let mut edited = m.clone(); + edited.name = "Sunny Window".into(); + edited.sig = sign(&SigningKey::from_bytes(&[6u8; 32]), &manifest_sign_payload(&edited)); + let eb = bincode::serialize(&edited).unwrap(); + assert_eq!(validate_revision(&owner, blake3::hash(&eb).as_bytes(), &eb), Err(Invalid::BadSignature)); + + let mut p = PointerState { + schema_version: SCHEMA_VERSION, + owner, + playlist_uuid: [9; 16], + sequence: 1, + current: Some(RevisionRef { content_hash: hash, revision_seq: 1, entry_count: 1, byte_length: bytes.len() as u32, name: "Rainy Window".into() }), + withdrawn: false, + sig: vec![], + }; + p.sig = sign(&key, &pointer_sign_payload(&p)); + let pb = bincode::serialize(&p).unwrap(); + assert_eq!(validate_pointer(&owner, &[9; 16], &pb).unwrap(), p); + assert_eq!(validate_pointer(&owner, &[8; 16], &pb), Err(Invalid::WrongOwner)); + } +} diff --git a/src-tauri/assets/playlist_pointer_contract.wasm b/src-tauri/assets/playlist_pointer_contract.wasm new file mode 100644 index 0000000000000000000000000000000000000000..3f6180e99b7f8ae36b16a6decaf892f8ebd41d20 GIT binary patch literal 177666 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%0Dc~A5 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 CVw5rf literal 0 HcmV?d00001 diff --git a/src-tauri/assets/playlist_revision_contract.wasm b/src-tauri/assets/playlist_revision_contract.wasm new file mode 100644 index 0000000000000000000000000000000000000000..072503f9d6be01ca8f9bdc17895e6bc999abe90f GIT binary patch literal 190226 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

Z__87BPjqr_B(F*VfH7isDg0kSzRht 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

BU1rFk;h%9E*y3%xROf1+QTpc8TJ( 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 Lqb2)YUEu!!XSj-` literal 0 HcmV?d00001 diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 0382de3..8e151cd 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -930,6 +930,7 @@ pub async fn connect_and_login( // never reach the Inbox (slsk_link.rs). if crate::slsk_link::intercept_pm(&event_app, &username, &message).await || crate::friends::intercept_pm(&event_app, &username, &message) + || crate::shared_playlists::intercept_pm(&event_app, &username, &message) { continue; } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 70a0124..c6b99db 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -21,6 +21,7 @@ mod playlists; mod provider_playlist; mod preview; mod setlist_scan; +mod shared_playlists; mod shazam; mod slsk_link; mod smtc; @@ -136,6 +137,14 @@ pub fn run() { friends::friend_decline, friends::friend_remove, friends::friend_forget, + shared_playlists::shared_playlists_mine, + shared_playlists::shared_playlist_publish, + shared_playlists::shared_playlist_withdraw, + shared_playlists::shared_playlist_fetch, + shared_playlists::shared_playlist_import, + shared_playlists::share_send, + shared_playlists::shares_inbox, + shared_playlists::share_dismiss, commands::buddy_list, commands::buddy_add, commands::buddy_remove, diff --git a/src-tauri/src/shared_playlists.rs b/src-tauri/src/shared_playlists.rs new file mode 100644 index 0000000..d345335 --- /dev/null +++ b/src-tauri/src/shared_playlists.rs @@ -0,0 +1,554 @@ +//! Shared playlists (F3 → the app): a playlist is published as an +//! immutable, content-addressed REVISION (the portable manifest — entry +//! occurrences with display fallbacks, never a path) plus an owner-signed +//! POINTER to the current revision per (owner, playlist uuid). Editing +//! publishes a new revision and bumps the pointer; withdrawing bumps the +//! pointer to "none", and the truthful line stays: published revisions +//! remain fetchable, nothing on the network is erased. +//! +//! Both contract wasms are bundled commitments like the persona ones +//! (`assets/playlist_revision_contract.wasm`, `assets/playlist_pointer_ +//! contract.wasm`, from research/freenet-f3; code hashes pinned by tests). +//! +//! Sharing WITH someone sends an address, nothing else — `SSSHARE1?` +//! over the same Soulseek PM channel the link proof and friends use. The +//! recipient sees a card, fetches the manifest through their own node, +//! verifies it against the owner's key, and imports it through the app's +//! normal playlist-import path (the review resolves tracks against their +//! library and the catalog, and unowned rows become Soulseek streams). + +use std::collections::BTreeMap; +use std::path::PathBuf; +use std::time::{SystemTime, UNIX_EPOCH}; + +use freenet_adapter::FreenetAdapter; +use persona_state as ps; +use persona_state::playlist as pl; +use persona_state::slsk_link::normalize_username; +use serde::{Deserialize, Serialize}; +use tauri::{Emitter, Manager, State}; + +use crate::persona; +use crate::pipeline::LibraryState; +use crate::playlist_formats::{ParsedEntry, ParsedPlaylist}; +use crate::playlists::{self, ImportDraft}; +use crate::state::AppState; + +const REV_WASM: &[u8] = include_bytes!("../assets/playlist_revision_contract.wasm"); +const PTR_WASM: &[u8] = include_bytes!("../assets/playlist_pointer_contract.wasm"); +const SHARE_PREFIX: &str = "SSSHARE1?"; +pub const EVENT: &str = "community:shares"; + +/// A playlist this device has published, by local playlist id. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Published { + pub playlist_id: i64, + pub uuid: String, + pub revision_seq: u64, + pub pointer_seq: u64, + /// The current revision's content hash (b58); stays after a withdraw so + /// the next publication still links to its predecessor. + pub current_hash: Option, + pub name: String, + pub entry_count: u32, + pub withdrawn: bool, + pub published_at: u64, +} + +/// A reference someone sent us: an address, plus what they said it was. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ShareCard { + pub id: String, + pub from_username: String, + pub owner_key: String, + pub playlist_uuid: String, + pub name: String, + pub entry_count: u32, + pub received_at: u64, +} + +#[derive(Default, Serialize, Deserialize)] +struct Ledger { + #[serde(default)] + published: BTreeMap, + #[serde(default)] + inbox: Vec, +} + +/// What travels in a share: the address and a display hint. +#[derive(Serialize, Deserialize)] +struct ShareRef { + owner: [u8; 32], + playlist_uuid: [u8; 16], + name: String, + entry_count: u32, +} + +#[derive(Debug, Serialize)] +pub struct ShareEntry { + pub position: u32, + pub title: String, + pub artist: String, + pub album: String, + pub duration_secs: Option, + pub note: Option, +} + +/// A fetched, VERIFIED shared playlist as the reader sees it. +#[derive(Debug, Serialize)] +pub struct ShareView { + pub owner_key: String, + pub playlist_uuid: String, + pub name: String, + pub description: String, + pub revision_seq: u64, + pub content_hash: String, + pub withdrawn: bool, + pub entries: Vec, +} + +fn now_secs() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|d| d.as_secs()) + .unwrap_or(0) +} +fn rand16() -> [u8; 16] { + use rand::RngCore; + let mut n = [0u8; 16]; + rand::thread_rng().fill_bytes(&mut n); + n +} +fn b58(bytes: &[u8]) -> String { + bs58::encode(bytes).into_string() +} +fn bytes32(b58s: &str) -> Result<[u8; 32], String> { + bs58::decode(b58s) + .into_vec() + .map_err(|e| format!("bad key: {e}"))? + .as_slice() + .try_into() + .map_err(|_| "not 32 bytes".to_string()) +} +fn bytes16(b58s: &str) -> Result<[u8; 16], String> { + bs58::decode(b58s) + .into_vec() + .map_err(|e| format!("bad id: {e}"))? + .as_slice() + .try_into() + .map_err(|_| "not 16 bytes".to_string()) +} +/// Cut to a byte cap on a char boundary. +fn cap(s: &str, max: usize) -> String { + if s.len() <= max { + return s.to_string(); + } + let mut end = max; + while end > 0 && !s.is_char_boundary(end) { + end -= 1; + } + s[..end].to_string() +} + +fn path(app: &tauri::AppHandle) -> Result { + Ok(app + .path() + .app_data_dir() + .map_err(|e| e.to_string())? + .join("freenet") + .join("playlists-ledger.json")) +} +fn load(app: &tauri::AppHandle) -> Ledger { + path(app) + .ok() + .and_then(|p| std::fs::read(p).ok()) + .and_then(|b| serde_json::from_slice(&b).ok()) + .unwrap_or_default() +} +fn save(app: &tauri::AppHandle, ledger: &Ledger) -> Result<(), String> { + let p = path(app)?; + if let Some(dir) = p.parent() { + std::fs::create_dir_all(dir).map_err(|e| e.to_string())?; + } + std::fs::write(&p, serde_json::to_vec_pretty(ledger).map_err(|e| e.to_string())?) + .map_err(|e| e.to_string())?; + let _ = app.emit(EVENT, ()); + Ok(()) +} + +async fn own_key(app: &tauri::AppHandle) -> Result<[u8; 32], String> { + let adapter = app.state::().freenet.clone(); + let info = persona::current(&adapter) + .await? + .ok_or("create a SoulStream identity first")?; + bytes32(&info.public_key) +} +async fn send_pm(app: &tauri::AppHandle, to: &str, text: &str) -> Result<(), String> { + let st = app.state::(); + let guard = st.client.lock().await; + guard + .as_ref() + .ok_or("not connected to Soulseek")? + .message_user(to, text) + .map_err(|e| e.to_string()) +} + +// ---------------------------------------------------------------- publish + +/// Publish (or re-publish) a local playlist: a new signed revision and a +/// pointer bump. Nothing about local files leaves the machine — entries +/// carry titles, artists, albums, durations and a text hint only. +pub async fn publish(app: &tauri::AppHandle, lib: &LibraryState, playlist_id: i64) -> Result { + let adapter: FreenetAdapter = app.state::().freenet.clone(); + let owner = own_key(app).await?; + let l = lib.library.clone(); + let (meta, items) = tauri::async_runtime::spawn_blocking(move || -> Result<_, String> { + let meta = l + .list_playlists() + .map_err(|e| e.to_string())? + .into_iter() + .find(|p| p.id == playlist_id) + .ok_or("no such playlist")?; + let items = l.playlist_items(playlist_id).map_err(|e| e.to_string())?; + Ok((meta, items)) + }) + .await + .map_err(|e| e.to_string())??; + if items.len() > pl::MAX_ENTRIES { + return Err(format!("{} entries is over the {} cap", items.len(), pl::MAX_ENTRIES)); + } + let mut ledger = load(app); + let key = playlist_id.to_string(); + let prev = ledger.published.get(&key).cloned(); + let uuid = match &prev { + Some(p) => bytes16(&p.uuid)?, + None => rand16(), + }; + let revision_seq = prev.as_ref().map(|p| p.revision_seq + 1).unwrap_or(1); + let prev_hash = match prev.as_ref().and_then(|p| p.current_hash.as_deref()) { + Some(h) => Some(bytes32(h)?), + None => None, + }; + let entries: Vec = items + .iter() + .enumerate() + .map(|(i, it)| pl::EntryV1 { + entry_id: rand16(), + position: i as u32, + recording: pl::RecordingRef { + musicbrainz_recording_id: None, + isrcs: vec![], + deezer_id: None, + apple_music_id: None, + title: cap(&it.title, pl::MAX_FIELD_BYTES), + artists: vec![cap(&it.artist, pl::MAX_FIELD_BYTES)], + album: cap(it.album.as_deref().unwrap_or(""), pl::MAX_FIELD_BYTES), + duration_ms: it.duration_secs.map(|s| s.saturating_mul(1000)), + release_year: None, + }, + note: it.note.as_deref().map(|n| cap(n, pl::MAX_NOTE_BYTES)), + slsk_hint: Some(cap(&format!("{} {}", it.artist, it.title), pl::MAX_FIELD_BYTES)), + }) + .collect(); + let mut m = pl::ManifestV1 { + schema_version: pl::SCHEMA_VERSION, + owner, + playlist_uuid: uuid, + revision_seq, + prev_revision_hash: prev_hash, + name: cap(&meta.name, pl::MAX_NAME_BYTES), + description: cap(meta.description.as_deref().unwrap_or(""), pl::MAX_DESC_BYTES), + artwork: None, + entries, + sig: vec![], + }; + m.sig = persona::sign(&adapter, pl::SIGN_DOMAIN, pl::manifest_sign_payload(&m)).await?; + let bytes = bincode::serialize(&m).map_err(|e| e.to_string())?; + let hash = ps::content_hash(&bytes); + adapter + .contract_put(REV_WASM.to_vec(), &pl::make_rev_params(&owner, &hash), bytes.clone(), false) + .await + .map_err(|e| e.to_string())?; + let pointer_seq = prev.as_ref().map(|p| p.pointer_seq + 1).unwrap_or(1); + let mut p = pl::PointerState { + schema_version: pl::SCHEMA_VERSION, + owner, + playlist_uuid: uuid, + sequence: pointer_seq, + current: Some(pl::RevisionRef { + content_hash: hash, + revision_seq, + entry_count: m.entries.len() as u32, + byte_length: bytes.len() as u32, + name: m.name.clone(), + }), + withdrawn: false, + sig: vec![], + }; + p.sig = persona::sign(&adapter, pl::SIGN_DOMAIN, pl::pointer_sign_payload(&p)).await?; + let pb = bincode::serialize(&p).map_err(|e| e.to_string())?; + let params = pl::make_ptr_params(&owner, &uuid); + if prev.is_some() { + adapter.contract_update(PTR_WASM.to_vec(), ¶ms, pb).await.map(|_| ()) + } else { + adapter.contract_put(PTR_WASM.to_vec(), ¶ms, pb, false).await.map(|_| ()) + } + .map_err(|e| e.to_string())?; + let rec = Published { + playlist_id, + uuid: b58(&uuid), + revision_seq, + pointer_seq, + current_hash: Some(b58(&hash)), + name: m.name.clone(), + entry_count: m.entries.len() as u32, + withdrawn: false, + published_at: now_secs(), + }; + ledger.published.insert(key, rec.clone()); + save(app, &ledger)?; + log::info!("shared playlists: published {:?} rev {} ({} entries)", rec.name, revision_seq, rec.entry_count); + Ok(rec) +} + +/// Withdraw: the pointer moves to "none". Revisions already published stay +/// fetchable on the network — the ledger keeps saying so. +pub async fn withdraw(app: &tauri::AppHandle, playlist_id: i64) -> Result { + let adapter = app.state::().freenet.clone(); + let owner = own_key(app).await?; + let mut ledger = load(app); + let key = playlist_id.to_string(); + let prev = ledger.published.get(&key).cloned().ok_or("that playlist was never published")?; + if prev.withdrawn { + return Ok(prev); + } + let uuid = bytes16(&prev.uuid)?; + let mut p = pl::PointerState { + schema_version: pl::SCHEMA_VERSION, + owner, + playlist_uuid: uuid, + sequence: prev.pointer_seq + 1, + current: None, + withdrawn: true, + sig: vec![], + }; + p.sig = persona::sign(&adapter, pl::SIGN_DOMAIN, pl::pointer_sign_payload(&p)).await?; + let pb = bincode::serialize(&p).map_err(|e| e.to_string())?; + adapter + .contract_update(PTR_WASM.to_vec(), &pl::make_ptr_params(&owner, &uuid), pb) + .await + .map_err(|e| e.to_string())?; + let rec = Published { pointer_seq: prev.pointer_seq + 1, withdrawn: true, ..prev }; + ledger.published.insert(key, rec.clone()); + save(app, &ledger)?; + Ok(rec) +} + +// ---------------------------------------------------------------- read + +/// Resolve (owner, uuid) through the network: pointer, then the revision it +/// names, verified in the plan's order before anything is shown. +pub async fn fetch(app: &tauri::AppHandle, owner_b58: &str, uuid_b58: &str) -> Result { + let adapter = app.state::().freenet.clone(); + let owner = bytes32(owner_b58)?; + let uuid = bytes16(uuid_b58)?; + let ptr_ids = FreenetAdapter::contract_ids(PTR_WASM.to_vec(), &pl::make_ptr_params(&owner, &uuid)); + let pbytes = adapter.contract_get(&ptr_ids.instance, false).await.map_err(|e| { + if e.to_string().contains("not found") { + "no such shared playlist on the network (or not reachable yet)".to_string() + } else { + e.to_string() + } + })?; + let p = pl::validate_pointer(&owner, &uuid, &pbytes).map_err(|e| format!("pointer failed verification: {e}"))?; + let Some(r) = p.current.filter(|_| !p.withdrawn) else { + return Ok(ShareView { + owner_key: owner_b58.to_string(), + playlist_uuid: uuid_b58.to_string(), + name: String::new(), + description: String::new(), + revision_seq: 0, + content_hash: String::new(), + withdrawn: true, + entries: vec![], + }); + }; + let rev_ids = FreenetAdapter::contract_ids(REV_WASM.to_vec(), &pl::make_rev_params(&owner, &r.content_hash)); + let rbytes = adapter.contract_get(&rev_ids.instance, false).await.map_err(|e| e.to_string())?; + let m = pl::validate_revision(&owner, &r.content_hash, &rbytes) + .map_err(|e| format!("revision failed verification: {e}"))?; + Ok(ShareView { + owner_key: owner_b58.to_string(), + playlist_uuid: uuid_b58.to_string(), + name: m.name, + description: m.description, + revision_seq: m.revision_seq, + content_hash: b58(&r.content_hash), + withdrawn: false, + entries: m + .entries + .into_iter() + .map(|e| ShareEntry { + position: e.position, + title: e.recording.title, + artist: e.recording.artists.join(", "), + album: e.recording.album, + duration_secs: e.recording.duration_ms.map(|ms| ms / 1000), + note: e.note, + }) + .collect(), + }) +} + +/// A verified shared playlist staged through the app's own import path. +pub async fn import( + app: &tauri::AppHandle, + lib: &State<'_, LibraryState>, + owner_b58: &str, + uuid_b58: &str, +) -> Result { + let v = fetch(app, owner_b58, uuid_b58).await?; + if v.withdrawn { + return Err("the owner withdrew this playlist".into()); + } + let parsed = ParsedPlaylist { + format: "soulstream".into(), + title: Some(v.name.clone()), + description: Some(v.description.clone()).filter(|d| !d.trim().is_empty()), + entries: v + .entries + .iter() + .map(|e| ParsedEntry { + ordinal: e.position + 1, + title: Some(e.title.clone()), + artist: Some(e.artist.clone()), + album: Some(e.album.clone()).filter(|a| !a.trim().is_empty()), + duration_secs: e.duration_secs, + location: None, + start_ms: None, + raw: format!("{} - {}", e.artist, e.title), + }) + .collect(), + warnings: vec![], + }; + playlists::resolve_draft(lib, parsed, format!("SoulStream · {}", v.name), None).await +} + +// ---------------------------------------------------------------- share carry + +pub async fn send(app: &tauri::AppHandle, username: &str, playlist_id: i64) -> Result<(), String> { + let ledger = load(app); + let rec = ledger + .published + .get(&playlist_id.to_string()) + .ok_or("publish the playlist first")?; + if rec.withdrawn { + return Err("that playlist is withdrawn — publish it again first".into()); + } + let owner = own_key(app).await?; + let r = ShareRef { + owner, + playlist_uuid: bytes16(&rec.uuid)?, + name: rec.name.clone(), + entry_count: rec.entry_count, + }; + use base64::Engine; + let bytes = bincode::serialize(&r).map_err(|e| e.to_string())?; + let text = format!("{SHARE_PREFIX}{}", base64::engine::general_purpose::STANDARD.encode(bytes)); + send_pm(app, username, &text).await?; + log::info!("shared playlists: sent {:?} to {username}", rec.name); + Ok(()) +} + +/// The event pump hands private messages here after the link and friend +/// handshakes. True means it was a share reference, now a card in the Inbox. +pub fn intercept_pm(app: &tauri::AppHandle, from: &str, message: &str) -> bool { + let Some(rest) = message.trim().strip_prefix(SHARE_PREFIX) else { return false }; + use base64::Engine; + let Ok(bytes) = base64::engine::general_purpose::STANDARD.decode(rest.trim()) else { return true }; + let Ok(r) = bincode::deserialize::(&bytes) else { return true }; + let card = ShareCard { + id: format!("{}:{}:{}", normalize_username(from), b58(&r.owner), b58(&r.playlist_uuid)), + from_username: from.to_string(), + owner_key: b58(&r.owner), + playlist_uuid: b58(&r.playlist_uuid), + name: cap(&r.name, pl::MAX_NAME_BYTES), + entry_count: r.entry_count, + received_at: now_secs(), + }; + let mut ledger = load(app); + ledger.inbox.retain(|c| c.id != card.id); + ledger.inbox.push(card); + if let Err(e) = save(app, &ledger) { + log::warn!("shared playlists: could not keep the share from {from}: {e}"); + } else { + log::info!("shared playlists: share received from {from}"); + } + true +} + +// ---------------------------------------------------------------- commands + +#[tauri::command] +pub fn shared_playlists_mine(app: tauri::AppHandle) -> Vec { + let mut v: Vec<_> = load(&app).published.into_values().collect(); + v.sort_by(|a, b| b.published_at.cmp(&a.published_at)); + v +} +#[tauri::command] +pub async fn shared_playlist_publish( + app: tauri::AppHandle, + lib: State<'_, LibraryState>, + playlist_id: i64, +) -> Result { + publish(&app, &lib, playlist_id).await +} +#[tauri::command] +pub async fn shared_playlist_withdraw(app: tauri::AppHandle, playlist_id: i64) -> Result { + withdraw(&app, playlist_id).await +} +#[tauri::command] +pub async fn shared_playlist_fetch(app: tauri::AppHandle, owner: String, uuid: String) -> Result { + fetch(&app, &owner, &uuid).await +} +#[tauri::command] +pub async fn shared_playlist_import( + app: tauri::AppHandle, + lib: State<'_, LibraryState>, + owner: String, + uuid: String, +) -> Result { + import(&app, &lib, &owner, &uuid).await +} +#[tauri::command] +pub async fn share_send(app: tauri::AppHandle, username: String, playlist_id: i64) -> Result<(), String> { + send(&app, &username, playlist_id).await +} +#[tauri::command] +pub fn shares_inbox(app: tauri::AppHandle) -> Vec { + let mut v = load(&app).inbox; + v.sort_by(|a, b| b.received_at.cmp(&a.received_at)); + v +} +#[tauri::command] +pub fn share_dismiss(app: tauri::AppHandle, id: String) -> Result<(), String> { + let mut ledger = load(&app); + ledger.inbox.retain(|c| c.id != id); + save(&app, &ledger) +} + +#[cfg(test)] +mod tests { + use super::*; + + /// The bundled contracts are commitments (copy-forward is disabled + /// upstream): a changed wasm re-keys every published playlist. + #[test] + fn contract_generations_are_pinned() { + let owner = [7u8; 32]; + let rev = FreenetAdapter::contract_ids(REV_WASM.to_vec(), &pl::make_rev_params(&owner, &[1u8; 32])); + let ptr = FreenetAdapter::contract_ids(PTR_WASM.to_vec(), &pl::make_ptr_params(&owner, &[2u8; 16])); + assert_eq!(rev.code_hash, "2JYdHHe3j59CVwCCKKeicjaF3rqoY2qjEbrYc95uUjkk"); + assert_eq!(ptr.code_hash, "Daqn9EMctrTniK5s5x4m9QBHYixsf265UMUAmLPATg5S"); + } +} diff --git a/src/lib/api.js b/src/lib/api.js index f51a035..b0f2aa8 100644 --- a/src/lib/api.js +++ b/src/lib/api.js @@ -162,6 +162,14 @@ export const friendAccept = (id) => invoke("friend_accept", { id }); export const friendDecline = (id) => invoke("friend_decline", { id }); export const friendRemove = (id) => invoke("friend_remove", { id }); export const friendForget = (id) => invoke("friend_forget", { id }); +export const sharedPlaylistsMine = () => invoke("shared_playlists_mine"); +export const sharedPlaylistPublish = (playlistId) => invoke("shared_playlist_publish", { playlistId }); +export const sharedPlaylistWithdraw = (playlistId) => invoke("shared_playlist_withdraw", { playlistId }); +export const sharedPlaylistFetch = (owner, uuid) => invoke("shared_playlist_fetch", { owner, uuid }); +export const sharedPlaylistImport = (owner, uuid) => invoke("shared_playlist_import", { owner, uuid }); +export const shareSend = (username, playlistId) => invoke("share_send", { username, playlistId }); +export const sharesInbox = () => invoke("shares_inbox"); +export const shareDismiss = (id) => invoke("share_dismiss", { id }); export const buddyList = () => invoke("buddy_list"); export const buddyAdd = (username) => invoke("buddy_add", { username }); export const buddyRemove = (username) => invoke("buddy_remove", { username }); diff --git a/src/lib/community.svelte.js b/src/lib/community.svelte.js index aec708c..7bfe4bc 100644 --- a/src/lib/community.svelte.js +++ b/src/lib/community.svelte.js @@ -65,6 +65,12 @@ export const community = $state({ linkErrors: {}, /** friends_list: every relationship this device holds, newest first. */ friends: [], + /** shares_inbox: playlist references people sent us, newest first. */ + shares: [], + /** card id → fetched ShareView | {pending} | {error} (the Verify button). */ + sharePreviews: {}, + /** shared_playlists_mine: what this device has published. */ + published: [], /** persona key → ProfileView | {none} | {error} | {pending}: other * people's signed profiles, read once per session when surfaced. */ remoteProfiles: {}, @@ -309,11 +315,15 @@ export async function initCommunity() { else if (community.persona) community.persona.available = false; }); api.onEvent("community:friends", () => void refreshFriends()); + api.onEvent("community:shares", () => { + void refreshShares(); + void refreshPublished(); + }); api.onEvent("soulseek:user-state", (p) => { if (p.status === 1 || p.status === 2) noteSeen(p.username); }); } - await Promise.all([refreshFreenet(), loadContacts(), refreshLinks(), refreshFriends()]); + await Promise.all([refreshFreenet(), loadContacts(), refreshLinks(), refreshFriends(), refreshShares(), refreshPublished()]); await refreshPersona(); } @@ -419,7 +429,67 @@ export const friendCount = () => community.friends.filter((f) => f.state === "fr export const pendingIn = () => community.friends.filter((f) => f.state === "pending-in"); +// ---- shared playlists --------------------------------------------------------------- +export async function refreshShares() { + try { + community.shares = await api.sharesInbox(); + } catch { + // stays as it was + } +} +export async function refreshPublished() { + try { + community.published = await api.sharedPlaylistsMine(); + } catch { + // stays as it was + } +} +export const publishedFor = (playlistId) => community.published.find((p) => p.playlist_id === playlistId) ?? null; +export const sharedPublish = (playlistId) => + run("publish:" + playlistId, async () => { + const r = await api.sharedPlaylistPublish(playlistId); + await refreshPublished(); + return r; + }); +export const sharedWithdraw = (playlistId) => + run("publish:" + playlistId, async () => { + await api.sharedPlaylistWithdraw(playlistId); + await refreshPublished(); + }); +export const shareSend = (username, playlistId) => run("share:" + playlistId, () => api.shareSend(username, playlistId)); +export const shareDismiss = (id) => + run("share:" + id, async () => { + await api.shareDismiss(id); + await refreshShares(); + }); +/** Fetch and verify a shared playlist through our node — nothing imported. */ +export async function sharePreview(card) { + community.sharePreviews[card.id] = { pending: true }; + try { + community.sharePreviews[card.id] = await api.sharedPlaylistFetch(card.owner_key, card.playlist_uuid); + } catch (e) { + community.sharePreviews[card.id] = { error: String(e?.message ?? e) }; + } +} +/** Fetch, verify, stage through the app's import path, commit — the new + * playlist's id comes back; the card is dismissed. */ +export const shareImport = (card) => + run("import:" + card.id, async () => { + const draft = await api.sharedPlaylistImport(card.owner_key, card.playlist_uuid); + const id = await api.playlistImportCommit( + draft.name ?? card.name, + draft.description ?? null, + draft.kind ?? "manual", + draft.entries, + draft.cover_url ?? null, + ); + await api.shareDismiss(card.id); + await refreshShares(); + return id; + }); + + // Dev handle beside `__soulstream` (state.svelte.js): probes reach the store // through this, never through a bare import (which would be a second copy). if (import.meta.env.DEV) globalThis.__community = community; -if (import.meta.env.DEV) globalThis.__communityActions = { friendRequest, friendAccept, friendDecline, friendRemove, friendForget, checkLink, refreshFriends }; +if (import.meta.env.DEV) globalThis.__communityActions = { friendRequest, friendAccept, friendDecline, friendRemove, friendForget, checkLink, refreshFriends, sharedPublish, sharedWithdraw, shareSend, sharePreview, shareImport, refreshShares, refreshPublished }; diff --git a/src/views/Community.svelte b/src/views/Community.svelte index 087244b..a71e6a1 100644 --- a/src/views/Community.svelte +++ b/src/views/Community.svelte @@ -72,6 +72,11 @@ friendshipFor, friendCount, pendingIn, + sharePreview, + shareImport, + shareDismiss, + sharedPublish, + sharedWithdraw, } from "../lib/community.svelte.js"; onMount(() => { @@ -423,6 +428,10 @@ const drawerLink = $derived(drawerUser ? linkFor(drawerUser) : null); const drawerRemote = $derived(drawerLink ? community.remoteProfiles[drawerLink.persona_key] : null); const drawerFriend = $derived(drawerUser ? friendshipFor(drawerUser) : null); + async function importShare(card) { + const id = await shareImport(card); + if (id) goToView("playlist", { playlistId: id, label: card.name }); + } const isMe = (u) => !!me && (u ?? "").trim().toLowerCase() === me.trim().toLowerCase(); $effect(() => { const lk = drawerLink; @@ -569,7 +578,36 @@ {/each} {/if} - {#if !convos.length} + {#if community.shares.length} +
+ {#each community.shares as c (c.id)} + {@const pv = community.sharePreviews[c.id]} +
+
+ +
+
{c.name}
+
{c.entry_count} {c.entry_count === 1 ? "track" : "tracks"} · playlist · shared by {fmtWhen(c.received_at * 1000)}
+
+ SoulStream + signed by {fpShort(c.owner_key)} + {#if pv && !pv.pending && !pv.error && !pv.withdrawn}·verified · revision {pv.revision_seq}{/if} + {#if pv?.withdrawn}·withdrawn by the owner{/if} + {#if pv?.error}·{pv.error}{/if} +
+
+
+
+ + + + tracks resolve against your library first; the rest become Soulseek streams +
+
+ {/each} +
+ {/if} + {#if !convos.length && !community.shares.length && !pendingIn().length}
No conversations yet
@@ -1044,6 +1082,26 @@
{#if key}
+
+

Your public playlists {community.published.filter((p) => !p.withdrawn).length}

+ {#if !community.published.length} +

Nothing published yet. Open a playlist and choose Share on SoulStream: a signed manifest goes to the network under your ID — titles, artists, albums, durations, your notes; never a file, never a path.

+ {:else} + {#each community.published as p (p.playlist_id)} +
+ +
{p.name}
{p.entry_count} tracks · revision {p.revision_seq} · {p.withdrawn ? "withdrawn" : "published"} {fmtWhen(p.published_at * 1000)}
+ {#if p.withdrawn} + + {:else} + + {/if} + +
+ {/each} +

Withdrawing stops your pointer; copies others already fetched stay with them.

+ {/if} +

Your SoulStream ID

@@ -1704,6 +1762,10 @@ .rp .nm { font-size: 15px; font-weight: 800; display: flex; align-items: center; gap: 8px; } .friendrow { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 12px; } .mark.fr { color: var(--accent-hover); } + .pubrow { display: flex; align-items: center; gap: 10px; padding: 8px 0; border-top: 1px solid var(--hair); } + .pubrow .ptx { flex: 1; min-width: 0; } + .pubrow .nm { font-size: 13px; font-weight: 800; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } + .mosaic-ph { width: 56px; height: 56px; border-radius: 8px; flex: none; display: grid; place-items: center; background: var(--accent-soft); color: var(--accent-hover); } .dsec { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--hair); } .dsec h4 { margin: 0 0 8px; font-size: 10.5px; font-weight: 900; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-muted); display: flex; align-items: center; gap: 8px; } .dsec h4 .src, .dsec h4 .chip { margin-left: auto; } diff --git a/src/views/Playlist.svelte b/src/views/Playlist.svelte index a924b87..f96023c 100644 --- a/src/views/Playlist.svelte +++ b/src/views/Playlist.svelte @@ -26,6 +26,16 @@ import * as api from "../lib/api.js"; import { findCatalogTrack } from "../lib/catalogMatch.js"; import Icon from "../components/Icon.svelte"; + import { + community, + initCommunity, + refreshPublished, + publishedFor, + sharedPublish, + sharedWithdraw, + shareSend, + statusKind, + } from "../lib/community.svelte.js"; const playlist = $derived( playlistStore.playlists.find((p) => p.id === ui.playlistId) ?? null, @@ -37,6 +47,54 @@ let menuOpen = $state(false); let confirmDelete = $state(false); let exportOpen = $state(false); + // ---- Share on SoulStream (shared_playlists.rs) ---- + let shareOpen = $state(false); + let shareTo = $state(""); + let shareNote = $state(""); + const friendNames = $derived(community.friends.filter((f) => f.state === "friends").map((f) => f.username)); + const nodeUp = $derived(statusKind(community.freenet?.status) === "connected"); + const canPublish = $derived(nodeUp && !!community.persona?.persona && !community.busy["publish:" + playlist?.id]); + async function openShare() { + menuOpen = false; + shareOpen = true; + shareNote = ""; + await initCommunity(); + await refreshPublished(); + } + async function doPublish() { + shareNote = ""; + try { + const r = await sharedPublish(playlist.id); + shareNote = `Published revision ${r.revision_seq} — ${r.entry_count} tracks.`; + } catch (e) { + shareNote = String(e?.message ?? e); + } + } + async function doWithdraw() { + shareNote = ""; + try { + await sharedWithdraw(playlist.id); + shareNote = "Withdrawn. Copies others already fetched stay with them."; + } catch (e) { + shareNote = String(e?.message ?? e); + } + } + async function sendShare() { + const to = shareTo.trim(); + if (!to) return; + shareNote = ""; + try { + await shareSend(to, playlist.id); + shareNote = `Sent to ${to} over Soulseek.`; + } catch (e) { + shareNote = String(e?.message ?? e); + } + } + // The sheet escapes the content pane (a containing block) to the body. + function portal(node) { + document.body.appendChild(node); + return { destroy: () => node.remove() }; + } let renaming = $state(false); let nameInput = $state(""); let editingDesc = $state(false); @@ -782,6 +840,9 @@ > Download all tracks +

{/if} +{#if shareOpen && playlist} + {@const pub = publishedFor(playlist.id)} + +{/if} +