Index: test/embed-resolver.test.js
===================================================================
--- test/embed-resolver.test.js	(revision 0101d0a23f8210828d4680832a5f1d30b5772d63)
+++ test/embed-resolver.test.js	(revision c52dc82434331354ded181d0905a44614892a72e)
@@ -52,12 +52,17 @@
 });
 
-test('a known provider beats oEmbed but loses to AP', async () => {
+// Regression: a hardcoded provider list used to short-circuit here and return a
+// card with no title and no thumbnail, so a YouTube link ended up storing
+// nothing at all. There is no provider list any more; every non-fediverse URL
+// takes the generic path, which is exactly what gives it a thumbnail.
+test('a video host is not special-cased and still gets a real card', async () => {
   const r = await resolveEmbed('https://youtu.be/abcdefghijk', io({
-    provider: () => ({ provider: 'youtube', id: 'abcdefghijk' }),
+    provider: () => ({ provider: 'youtube', id: 'abcdefghijk' }),   // ignored on purpose
     getPage: async () => OEMBED_PAGE,
     getJSON: async () => OEMBED_JSON,
   }));
-  assert.equal(r.kind, 'provider');
-  assert.equal(r.provider, 'youtube');
+  assert.equal(r.kind, 'oembed');
+  assert.equal(r.title, 'A talk');
+  assert.ok(r.media[0].url, 'and it has a thumbnail, which the old path never produced');
 });
 
@@ -115,5 +120,6 @@
   };
   const io = liveIO({ safeFetch: fakeFetch, detectProvider: () => null });
-  assert.equal(await io.getPage('https://x/huge'), null, 'oversized body refused');
+  // A JSON payload must parse whole, so an oversized one is refused outright.
+  assert.equal(await io.getJSON('https://x/huge'), null, 'oversized JSON refused');
   assert.equal(await io.getAP('https://x/boom'), null, 'a refused fetch is not an error');
   assert.deepEqual(await io.getAP('https://x/ok'), { type: 'Note', id: 'https://s/1' });
@@ -163,2 +169,15 @@
   assert.equal(r.url, 'https://lg.example/artikel');
 });
+
+// Regression, the one that kept YouTube blank: a page is read from the START and
+// cut off, never refused for being large. Refusing it meant no thumbnail at all
+// for exactly the sites people share most.
+test('a huge page is truncated, not rejected', async () => {
+  const { liveIO } = await import('../src/services/EmbedResolver.js');
+  const big = '<html><head>' + 'x'.repeat(5000) + '<meta property="og:title" content="T">'
+    + '<meta property="og:image" content="https://x/i.png"></head></html>';
+  const fakeFetch = async () => ({ ok: true, headers: { get: () => String(9_000_000) }, text: async () => big });
+  const io = liveIO({ safeFetch: fakeFetch, detectProvider: () => null });
+  const page = await io.getPage('https://x/huge');
+  assert.ok(page && page.includes('og:image'), 'the head survives the cap');
+});
