feat: precompute stream grouping during source sync (#13)
Move variant grouping work out of Live TV rendering into the catalog pipeline: a liveProjectionService builds the logical channel projection (schema in liveProjectionSchema) whenever a source is added, synced or modified (name change, new address), and the projection is served through a /live route. ChannelList now consumes the precomputed projection via a liveChannelProjection client service, recalculating only when the catalog changes. Cover projection building, incremental recompute and client consumption with tests. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -21,6 +21,17 @@ test('does not merge distinct numbered channels', () => {
|
||||
assert.deepEqual(logical.map(item => item.fingerprint), ['bein sports 1', 'bein sports 2']);
|
||||
});
|
||||
|
||||
test('preserves precomputed projection boundaries and display names', () => {
|
||||
const logical = grouping.groupChannels([
|
||||
channel('1', 'Shared Name HD', { logicalId: 'logical:a', logicalFingerprint: 'a', logicalDisplayName: 'Backend A' }),
|
||||
channel('2', 'Shared Name 4K', { logicalId: 'logical:b', logicalFingerprint: 'b', logicalDisplayName: 'Backend B' })
|
||||
]);
|
||||
assert.deepEqual(logical.map(item => [item.id, item.displayName]), [
|
||||
['logical:a', 'Backend A'],
|
||||
['logical:b', 'Backend B']
|
||||
]);
|
||||
});
|
||||
|
||||
test('logical favorite and hidden state are derived from individual streams', () => {
|
||||
const variants = [channel('1', 'BEIN SPORTS 1 HD'), channel('2', 'BEIN SPORTS 1 4K')];
|
||||
const logical = grouping.groupChannels(variants, {
|
||||
|
||||
Reference in New Issue
Block a user