- Add support for floats via `hours_minutes_seconds_float()`
- Add support for negative timestamps
- Rewrite regexes and be as strict as possible
- Rewrite and parametrize tests with an extensive list of formats
- Update cli.argparser/plugin arguments using `hours_minutes_seconds()`
- Fix options regex
- parse all alphanumerical options with dashes
- be more strict around the option-value operator
and properly ignore invalid option formats, just like comments
- Fix parsing of shorthand options
- Add tests
Increase the default value from 2 to 3, so that the default
configuration doesn't unnecessarily cause issues in certain live streams
where the connection of the broadcaster is unstable and the streaming
provider doesn't or can't queue new segments.
Try to keep this value reasonably low, so we can still stop streams
early when the `EXT-X-ENDLIST` tag is missing.
Allow users to customize the segment queue timing threshold which checks
whether to stop the stream early if no new segments were queued after
the playlist's target-duration multiplied by the queue-threshold-factor
has passed.
- Bump max version of sphinx from <7 to <8
- Bump max version of myst-parser to <3
- Pinpoint sphinx-design to 0.5.0
- Properly group dependencies by type
- Add `api/options` page and document `Options` class
- Move `Argument` and `Arguments` from plugin page to options page
- Add docstrings for `Streamlink.options` and `Plugin.options`
Move Streamlink's project metadata from setuptools's own `setup.cfg`
to the standardized `pyproject.toml` format (PEP621)
- Bump setuptools to `>=64.0.0`
- Bump pip dev-requirement to `>=21.0.0`
- Set two `author` entries, to keep the same `Author` and `Author-email`
core metadata in the resulting sdist and bdist packages
- Set `license.text` field instead of `license.file` and add the
setuptools-specific `license-files` config attribute, so that
the `License` and `License-File` core metadata doesn't change.
License data will receive another change in the future once PEP639
comes into effect
- By switching to PEP621 metadata, implicitly move the `Home-page`
core metadata to `Project-URL: Homepage, ...`
- Remove upper version constraint from `requires-python`
- Reformat some version strings of the `dependencies` field
Implement client-integrity-token acquirement using the webbrowser API:
1. Generate a new device ID
2. Open www.twitch.tv/CHANNEL and intercept its request with a dummy
response that returns an empty HTML document
3. Execute JS code which acquires the client-integrity token, similar
to the setup of Twitch's web player
4. Parse result and check the `is_bad_bot` value
5. Cache result and device-ID on success and set the GQL API endpoint
headers for the access token
Also:
- Add `--twitch-purge-client-integrity`
- Forward any `--twitch-api-header` values to the web browser when
acquiring a new client-integrity token (e.g. auth data)
- Rewrite access token schema result logic:
- Don't rely on `TypeError`s for checking whether a channel is offline
- Propagate any `PluginError`s when parsing the API response
- Always attempt to get an access token without a client-integrity
token first in order to avoid having to launch the web browser
when Twitch doesn't require a client-integrity token
- Update tests
- Revert `keywords` arg added to `HLSStream.parse_variant_playlist()`
in d314c5b
- Filter all variable keyword arguments before making any HTTP session
calls or storing the request args dict
- Make variable keyword arguments of all common public Stream methods
consistent by renaming them to "kwargs"