dash.js
Open Source Media Player
Seamless and reliable DASH streaming on any browser-based device
View onGitHub
5513
1732
504.9k
Sponsors
Trusted by the industry leaders
Latest updates from GitHub
Avoid Redundant DRM License Requests for Already-Usable Keys## Summary
When a multi-key DRM license has already been acquired, dash.js currently issues redundant license requests for key IDs (KIDs) that the CDM already reports as `usable`. This feature adds checks at multiple points in the protection pipeline to skip unnecessary license exchanges, reducing network overhead and improving playback startup for multi-period or multi-key encrypted content.
## Motivation
In scenarios involving multi-key licenses (e.g. a single license response covers multiple KIDs), the player may encounter `needkey`/`encrypted` events or manifest-signaled init data for KIDs that are already available in the CDM. Without this optimization, each event triggers a full license server round-trip even though the CDM can already decrypt the content. This is wasteful and can introduce unnecessary latency, especially on low-bandwidth connections or with rate-limited license servers.
I have implemented the changes locally with the help of AI. Please advise i. f you would like me to submit a PR. Feel free to reach out on slack or discord.Opened by petegalt—10 hours ago
Optimize CI/CD pipeline performance - Plan's proposal**Problem**
The current CI/CD setup does more work than necessary:
- linting runs more than once in the build path
- modern and legacy bundles are built sequentially
- deploy workflows rebuild and re-verify work that is already covered elsewhere
- the same `master` commit is rebuilt by multiple deploy workflows
- the PR functional job rebuilds the modern bundle instead of reusing it
- `publish_npm` triggers the build twice
- webpack filesystem cache is not used
- some dependency installation and caching paths are still suboptimal
The result is slower feedback and unnecessary runner usage.
**Proposed changes**
`P1` low-risk cleanup:
- [ ] remove the explicit build step from `publish_npm.yml` and rely on `prepack`
- [ ] add `karma-webdriver-launcher` to `devDependencies`
- [ ] add workflow `concurrency` to PR and branch verification
- [ ] narrow the root cache key to the root `package-lock.json`
- [ ] use `npm ci` for `samples/network-interceptor`
`P2` medium-scope improvements:
- [ ] keep only one ESLint pass in the CI build path
- [ ] split PR verification into small jobs so the functional job can reuse a `modern` build artifact without forcing the whole workflow to become sequential
- [ ] evaluate parallel modern/legacy builds
- [ ] evaluate webpack filesystem cache, locally first and then in CI if it proves useful
`P3` structural changes:
- [ ] consolidate `master` deploys around a single build
- [ ] consider a deploy-specific `build-only` path
- [ ] consider path filters for documentation-only changes
**Execution plan**
- land `P1` in one small PR
- land PR artifact reuse as a separate PR
- handle deploy consolidation separately, since it changes workflow structure more deeply
- keep build parallelization and webpack cache behind benchmarks
**Success criteria**
- `verify_pull_request` gets faster, especially on the functional path
- `publish_npm` performs only one effective build
- a single `master` commit is no longer rebuilt by multiple deploy workflows
- cache behavior improves or stays stable
- verification coverage does not regress
Opened by PascalThuet—15 hours ago
The previously set quality is lost, manually.The video stream is selected based on the size of the container + auto-tune.
Next, I manually change the quality to, say, 144 and turn off the settings.
`this.dsh.updateSettings({streaming:{abr:{limitBitrateByPortal:false, autoSwitchBitrate:{video:false}}}});`
Auto-tuning and auto-tuning relative to the container size is disabled, 144 is set to manual.
OK, then I switch to another manifest.
`this.dsh.attachSource(`/video/2/manifest.mpd`);`
The previously selected quality is missing, auto-tuning is disabled
```
this.dsh.attachSource(`/video/2/manifest.mpd`);
false, false
console.log(this.dsh.getSettings('video').streaming.abr.autoSwitchBitrate.video, this.dsh.getSettings('video').streaming.abr.limitBitrateByPortal);
```
The disabled settings before replacing the manifest are saved, while switching to a different quality.
What could be the problem here?
```
(this.dsh = dashjs.MediaPlayer().create()).updateSettings({
streaming: {
abr: {
limitBitrateByPortal: true,
maxBitrate: 6000
},
buffer: {bufferTimeAtTopQuality: 15, bufferTimeAtTopQualityLongForm: 15},
text: {
defaultEnabled: false,
dispatchForManualRendering: true
}
}
});
this.dsh.initialize(this.v = document.createElement('video'), `/video/1/manifest.mpd#t=${this.url.t || 0}`, autoplay);
```Opened by Zuldek1994822—yesterday






