Changeset 6100ce9 in Klonkt


Ignore:
Timestamp:
07/29/2026 12:12:38 PM (6 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
d56d471
Parents:
08ab8ad
Message:

Een dichte poort mag zeggen dat hij dicht is

Robin tikte op een videokaart in de app en er gebeurde niets. Geen speler, geen
melding, geen reactie. De speler was niet stuk: de afspeel-poort staat voor dat
account dicht, dus de server stuurt geen playerUrl mee en de kaart is niet
aantikbaar. Correct gedrag, maar het leest als kapot.

De kaart zegt nu dat er iets achter de poort zit. timelineEmbed voegt
shaer:playable toe wanneer er wel een speler zou zijn maar de poort dicht is.
Dat kost niets: de kaart toont al een videothumbnail, dus dat er video achter
zit is geen nieuws. Het is een mededeling, nooit een ingang.

Het verschil dat dit maakt: "deze app is stuk" wordt "dit is niet aan mij". Een
kaart die een tik opslokt leert geen van beide. En het staat de guardians
nergens in de weg: niets hieraan zet iets aan.

Changed files:
src/services/ActivityPubService.js

  • timelineEmbed: shaer:playable bij een dichte poort met een speler erachter

test/gated-settings.test.js

  • een dichte poort geeft geen speler maar geeft dat wel toe
  • een nieuwsartikel is geen dichte poort, die belooft niets

remarks: 333 tests groen. De clientkant (het regeltje op de kaart) zit in de
app-repos.

-robo
Co-Authored-By: Claude Opus 5 <noreply@…>

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    r08ab8ad r6100ce9  
    30993099    // player for PeerTube. Without one the card stays a thumbnail.
    31003100    const player = playback ? playerUrlFor(e.url) : null;
    3101     return player ? { ...e, 'shaer:playerUrl': player } : e;
     3101    if (player) return { ...e, 'shaer:playerUrl': player };
     3102    // The gate is shut and there IS something behind it. Saying so costs
     3103    // nothing (the card already shows a video thumbnail) and saves the child
     3104    // from tapping a card that will never answer: the app can explain instead
     3105    // of doing nothing. It stays a statement of fact, never a way in.
     3106    return playerUrlFor(e.url) ? { ...e, 'shaer:playable': true } : e;
    31023107  } catch { return undefined; }
    31033108}
  • test/gated-settings.test.js

    r08ab8ad r6100ce9  
    162162  assert.ok(shut && shut.url, 'the card itself still travels');
    163163  assert.equal(shut['shaer:playerUrl'], undefined, 'no player without the gate');
     164  // But the card says there IS something behind the gate, so the app can
     165  // explain the silence instead of ignoring a tap. Robin tapped a video that
     166  // could not answer and nothing happened, which reads as broken, not as shut.
     167  assert.equal(shut['shaer:playable'], true, 'a shut gate still admits that a player exists');
    164168
    165169  const open = AP2.timelineEmbed(yt, { playback: true });
     
    173177  const page = JSON.stringify({ url: 'https://yougubrands.com/about', title: 'About', media: [] });
    174178  assert.equal(AP2.timelineEmbed(page, { playback: true })['shaer:playerUrl'], undefined);
     179  // And no promise of one either: a news article is not a shut gate, it is
     180  // simply not a video, and the app must not offer to ask for it.
     181  assert.equal(AP2.timelineEmbed(page)['shaer:playable'], undefined);
    175182  assert.equal(AP2.playerUrlFor('https://nos.nl/artikel/1'), null);
    176183  // PeerTube is decentralised, so it is matched by shape, not by a host list.
Note: See TracChangeset for help on using the changeset viewer.