Restructure step 5: one media pipeline on a player host

- PlayerHost port (MediaKitHost): players by role, pins, hwdec policy,
  render probe, log routing, disposal order; the only media_kit user.
- MediaPipeline: plan (one pure switch over state, origin, caps,
  presence) -> resolve -> open (prepared player promoted, else fresh)
  -> ready; commands queued during a switch apply once (P15); viewers
  play the buffer and wait for a dropped source without seek loops (D6).
- Every web page resolved by our yt-dlp into an EDL with headers and
  cookies (danmaku excluded); mpv's ytdl_hook no longer used (ytdl=no).
- D11: sign-in errors say which cookies were used and whether they hold
  any for the site.
- Relay: 256 KiB slices read as they fill, superseded pulls released
  (seek-to-play ~4.2 s -> ~2.8 s, P29); own Jellyfin relay channel only
  when someone needs it (P28).
- STARSYNC_SMOKE run and a Windows CI smoke step after the build.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
foxyzandClaude Opus 5.5 committed 2026-10-16 01:08:54 +03:00
1 parent 8970f2694b
commit 25b19f2d6a
47 files changed
+4083 -1728

No files matched your search

+12 -10
View File
@@ -2,7 +2,8 @@ import 'dart:io';
import 'package:flutter_test/flutter_test.dart';
import 'package:media_kit/media_kit.dart';
import 'package:starsync/src/playback/playback_controller.dart';
import 'package:starsync/src/platform/desktop/media_kit_host.dart';
import 'package:starsync/src/session/media_pipeline.dart';
import 'package:starsync/src/shaders/shader_assets.dart';
import 'package:starsync/src/shaders/shader_presets.dart';
import 'package:starsync/src/state/settings.dart';
@@ -21,12 +22,14 @@ void main() {
support.createSync(recursive: true);
shaderSupportDir = () async => support;
final s = AppSettings.instance;
final p = PlaybackController();
final m = MediaPipeline(host: MediaKitHost());
final p = m.playback;
try {
// The saved choice goes on at player creation.
s.setShaderPreset(ShaderPreset.a);
await p.init();
final dynamic mpv = p.player.platform;
await m.start();
await p.applyShaders();
final mpv = p.player;
final modeA =
await shaderPathsFor(ShaderPreset.a, ShaderQuality.hq, const []);
expect(shaderListMatches(modeA, await mpv.getProperty('glsl-shaders')), isTrue);
@@ -59,17 +62,16 @@ void main() {
expect(await mpv.getProperty('glsl-shaders'), good.path);
// A recreated player (Reload video) gets the choice again.
await p.recreate();
expect(await (p.player.platform as dynamic).getProperty('glsl-shaders'),
good.path);
await m.reload();
await p.applyShaders();
expect(await p.player.getProperty('glsl-shaders'), good.path);
s.setShaderPreset(ShaderPreset.off);
await p.applyShaders(announce: true);
expect(await (p.player.platform as dynamic).getProperty('glsl-shaders'),
'');
expect(await p.player.getProperty('glsl-shaders'), '');
expect(p.shaderNotice.value?.text, 'Shaders: Off');
} finally {
await p.dispose();
await m.dispose();
}
});
}