From b5caee5b86f8ccb8264fe8c1a149fdcf0346ca45 Mon Sep 17 00:00:00 2001 From: saphid <4596216+saphid@users.noreply.github.com> Date: Mon, 28 Sep 2026 23:12:24 +1000 Subject: [PATCH] Library art: real gameplay instead of GitHub social cards; accept GIF sources GitHub's opengraph preview is repo text, stats and an identicon; as a Steam hero it looked broken. GitHub entries no longer default to it (the store draws its fallback, Steam gets generated art). Source GIFs (common gameplay captures) are accepted; the Frame's Chromium draws the first frame. Open Saber Plus uses its gameplay GIF as banner. Verified on the Frame: hero/wide now show gameplay. Co-Authored-By: Claude Opus 5.5 (1M context) --- tests/test_apk_more_sources.py | 8 +++----- tests/test_frame_android_library.py | 4 ++++ ui/apk_sources/github.py | 3 ++- ui/apk_sources/github_curated.json | 4 ++-- ui/frame_artwork.py | 8 +++++++- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/tests/test_apk_more_sources.py b/tests/test_apk_more_sources.py index 80e346f..f1879b9 100644 --- a/tests/test_apk_more_sources.py +++ b/tests/test_apk_more_sources.py @@ -37,7 +37,7 @@ class PublisherSources(unittest.TestCase): self.assertTrue(entry['summary']) images = entry['images'] self.assertEqual(entry['icon'], images['icon']) - for url in [images['icon'], images['banner']] + images['screenshots']: + for url in [u for u in [images['icon'], images['banner']] if u] + images['screenshots']: self.assertTrue(url.startswith('https://')) self.assertEqual(evidence[url]['status'], 200) self.assertTrue(evidence[url]['image']) @@ -53,8 +53,7 @@ class PublisherSources(unittest.TestCase): self.assertEqual(entry['images'], curated['images']) unknown = github.details(github.sources()[0], 'unknown/project') self.assertEqual(unknown['icon'], 'https://github.com/unknown.png') - self.assertEqual(unknown['images']['banner'], - 'https://opengraph.githubassets.com/1/unknown/project') + self.assertIsNone(unknown['images']['banner']) def test_real_releases(self): for key, repo in [('khronos', 'KhronosGroup/OpenXR-SDK-Source'), @@ -79,8 +78,7 @@ class PublisherSources(unittest.TestCase): for entry, repo in zip(entries, data['items']): self.assertEqual(entry['icon'], repo['owner']['avatar_url']) self.assertEqual(entry['images']['icon'], entry['icon']) - self.assertEqual(entry['images']['banner'], - 'https://opengraph.githubassets.com/1/' + repo['full_name']) + self.assertIsNone(entry['images']['banner']) self.assertEqual(entry['images']['screenshots'], []) self.assertFalse(github.details(github.sources()[0], 'unknown/project')['downloadable']) with self.assertRaises(SourceError): diff --git a/tests/test_frame_android_library.py b/tests/test_frame_android_library.py index fdee8cb..a124362 100644 --- a/tests/test_frame_android_library.py +++ b/tests/test_frame_android_library.py @@ -171,6 +171,10 @@ class ArtworkTests(unittest.TestCase): data = (FIXTURES / 'icon.jpg').read_bytes() self.assertEqual(art.image_type(data), 'jpg') self.assertEqual(art.image_type(data + b'\0' * 64), 'jpg') # trailing padding after EOI + gif = b'GIF89a' + struct.pack('= 10: + # Gameplay GIFs are common source screenshots; the Frame's Chromium draws their first frame. + w, h = struct.unpack_from('