Streamlink is a CLI utility which pipes video streams from various services into a video player
This report summarizes scanner evidence for streamlink/streamlink, a Python project with 11,841 GitHub stars. SynthScan examined 101,461 lines of code across 559 source files, recording 936 pattern matches distributed across 19 syntactic categories. The legacy adjusted pattern signal is 11.2 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 473 finding(s).
Are imports declared and package/API names verified? 366 finding(s).
Are wrappers, guards, and repeated structures necessary? 481 finding(s).
Which changes need focused human review? 936 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 936 distinct pattern matches across 19 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | build_backend/test_plugins_json.py | 142 | def test_parse_sequence_or_mapping(parser: type[ast.NodeVisitor], code: str, expected: Any, raises: nullcontext): | CODE |
| LOW | build_backend/test_build_backend.py | 42 | def test_filter_cmd_option_args(config_settings: dict, expected: str, options: list): | CODE |
| LOW | build_backend/__init__.py | 20 | def get_requires_for_build_wheel( # type: ignore[no-redef] | CODE |
| LOW | build_backend/plugins_json.py | 441 | def _filter_dataclass_none_value(items: list[tuple[str, Any]]) -> dict[str, Any]: | CODE |
| LOW | tests/test_streamlink_api.py | 24 | def test_no_streams_exception(self): | CODE |
| LOW | tests/test_streamlink_api.py | 37 | def test_stream_type_wildcard(self): | CODE |
| LOW | tests/conftest.py | 58 | def pytest_collection_modifyitems(items: list[pytest.Item]): # pragma: no cover | CODE |
| LOW | tests/conftest.py | 150 | def _clear_threadname_counters(): | CODE |
| LOW | tests/test_options.py | 131 | def test_mutablemapping_methods(self, options: MappedOptions): | CODE |
| LOW | tests/test_plugin.py | 171 | def test_matchers_inheritance(self): | CODE |
| LOW | tests/test_plugin.py | 195 | def test_matchers_inheritance_named_duplicate(self): | CODE |
| LOW | tests/test_plugin.py | 206 | def test_matchers_not_matching(self): | CODE |
| LOW | tests/test_plugin.py | 214 | def test_no_matchers_not_matching(self): | CODE |
| LOW | tests/test_plugin.py | 253 | def test_named_matchers_and_matches(self): | CODE |
| LOW | tests/test_plugin.py | 301 | def test_pluginargument_type_registry(self): | CODE |
| LOW | tests/test_plugin.py | 323 | def test_arguments_inheritance(self): | CODE |
| LOW | tests/test_plugin_userinput.py | 51 | def test_user_input_not_implemented(session: Streamlink, testplugin: _TestPlugin): | CODE |
| LOW | tests/test_plugin_userinput.py | 73 | def test_user_input_console_no_tty(console: Mock, testplugin: _TestPlugin): | CODE |
| LOW | tests/test_validate.py | 51 | def test_validate_failure_custom(self, schema: validate.Schema): | CODE |
| LOW | tests/test_validate.py | 1211 | def test_failure_url_attribute(self): | STRING |
| LOW | tests/test_validate.py | 1473 | def test_re_namespace_override(self): | STRING |
| LOW⚡ | tests/test_validate.py | 1646 | def test_chunk_newline_no_tag(self): | STRING |
| LOW⚡ | tests/test_validate.py | 1654 | def test_chunk_newline_ignored_tag(self): | STRING |
| LOW⚡ | tests/test_validate.py | 1662 | def test_chunk_newline_length_tag(self): | STRING |
| LOW | tests/test_validate.py | 1761 | def test_multiple_nested_context(self): | STRING |
| LOW | tests/test_api_websocket.py | 201 | def test_reconnect_disconnected(self, client: FakeWebsocketClient, websocketapp: Mock): | CODE |
| LOW | tests/test_cache.py | 273 | def test_expires_at_overflowerror(self, cache: Cache): | CODE |
| LOW | tests/test_logger.py | 529 | def test_capture_consecutive_once( | CODE |
| LOW | tests/plugins/conftest.py | 16 | def pytest_collection_modifyitems(items: list[pytest.Item]): # pragma: no cover | CODE |
| LOW⚡ | tests/plugins/conftest.py | 36 | def _parametrize_plugincanhandleurl_test_all_matchers_match(metafunc: pytest.Metafunc): | CODE |
| LOW⚡ | tests/plugins/conftest.py | 46 | def _parametrize_plugincanhandleurl_test_all_named_matchers_have_tests(metafunc: pytest.Metafunc): | CODE |
| LOW⚡ | tests/plugins/conftest.py | 56 | def _parametrize_plugincanhandleurl_test_url_matches_positive_unnamed(metafunc: pytest.Metafunc): | CODE |
| LOW⚡ | tests/plugins/conftest.py | 64 | def _parametrize_plugincanhandleurl_test_url_matches_positive_named(metafunc: pytest.Metafunc): | CODE |
| LOW⚡ | tests/plugins/conftest.py | 74 | def _parametrize_plugincanhandleurl_test_url_matches_groups_unnamed(metafunc: pytest.Metafunc): | CODE |
| LOW⚡ | tests/plugins/conftest.py | 84 | def _parametrize_plugincanhandleurl_test_url_matches_groups_named(metafunc: pytest.Metafunc): | CODE |
| LOW⚡ | tests/plugins/conftest.py | 94 | def _parametrize_plugincanhandleurl_test_url_matches_negative(metafunc: pytest.Metafunc): | CODE |
| LOW | tests/plugins/test_twitch.py | 185 | def test_multivariant_and_weights( | CODE |
| LOW | tests/plugins/test_twitch.py | 235 | def test_hls_daterange_unknown(self): | CODE |
| LOW | tests/plugins/test_twitch.py | 256 | def test_hls_daterange_by_class(self): | CODE |
| LOW | tests/plugins/test_twitch.py | 351 | def test_hls_has_preroll_and_midroll(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 404 | def test_hls_low_latency_has_prefetch(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 427 | def test_hls_no_low_latency_has_prefetch(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 450 | def test_hls_low_latency_no_prefetch(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 470 | def test_hls_low_latency_has_prefetch_has_preroll(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 493 | def test_hls_low_latency_has_prefetch_no_preroll_with_prefetch_ads(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 536 | def test_hls_low_latency_no_prefetch_has_preroll(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 559 | def test_hls_low_latency_no_ads_reload_time(self): | CODE |
| LOW | tests/plugins/test_twitch.py | 573 | def test_hls_prefetch_after_discontinuity(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 590 | def test_hls_ignored_discontinuity(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 962 | def test_integrity_check_not_forced(self, plugin: Twitch, mock: rm.Mocker): | CODE |
| LOW | tests/plugins/test_twitch.py | 997 | def test_integrity_check_forced(self, plugin: Twitch, mock: rm.Mocker): | CODE |
| LOW | tests/plugins/test_twitch.py | 1113 | def test_multivariant_response( | CODE |
| LOW | tests/plugins/test_twitch.py | 1259 | def test_metadata_channel_no_data(self, mock_request_channel, metadata): | CODE |
| LOW | tests/plugins/test_twitch.py | 1264 | def test_metadata_channel_no_category(self, mock_request_channel, metadata): | CODE |
| LOW | tests/plugins/test_twitch.py | 1287 | def test_metadata_video_no_data(self, mock_request_video, metadata): | CODE |
| LOW | tests/plugins/test_twitch.py | 1309 | def test_metadata_clip_no_data(self, mock_request_clip, metadata): | CODE |
| LOW⚡ | tests/plugins/__init__.py | 142 | def test_all_named_matchers_have_tests(self, matcher: Matcher): | CODE |
| LOW⚡ | tests/plugins/__init__.py | 148 | def test_url_matches_positive_unnamed(self, url: TUrl): | CODE |
| LOW⚡ | tests/plugins/__init__.py | 154 | def test_url_matches_positive_named(self, name: TName, url: TUrl): | CODE |
| LOW⚡ | tests/plugins/__init__.py | 161 | def test_url_matches_groups_unnamed(self, url: TUrl, groups: TMatchGroup): | CODE |
| 306 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | setup.py | 34 | CODE | |
| LOW | setup.py | 80 | CODE | |
| LOW | build_backend/onbuild.py | 1 | CODE | |
| LOW | build_backend/test_plugins_json.py | 1 | CODE | |
| LOW | build_backend/__init__.py | 2 | CODE | |
| LOW | build_backend/__init__.py | 13 | CODE | |
| LOW | build_backend/plugins_json.py | 1 | CODE | |
| LOW | build_backend/commands.py | 1 | CODE | |
| LOW | tests/test_streamlink_api.py | 1 | CODE | |
| LOW | tests/conftest.py | 1 | CODE | |
| LOW | tests/test_options.py | 1 | CODE | |
| LOW | tests/test_plugin.py | 1 | CODE | |
| LOW | tests/test_plugin_userinput.py | 1 | CODE | |
| LOW | tests/__init__.py | 8 | CODE | |
| LOW | tests/test_compat.py | 1 | CODE | |
| LOW | tests/test_api_websocket.py | 1 | CODE | |
| LOW | tests/test_cache.py | 1 | CODE | |
| LOW | tests/test_logger.py | 1 | CODE | |
| LOW | tests/mixins/stream_hls.py | 1 | CODE | |
| LOW | tests/plugins/conftest.py | 1 | CODE | |
| LOW | tests/plugins/test_rtpplay.py | 1 | CODE | |
| LOW | tests/plugins/test_dash.py | 1 | CODE | |
| LOW | tests/plugins/test_twitch.py | 1 | CODE | |
| LOW | tests/plugins/__init__.py | 1 | CODE | |
| LOW | tests/plugins/test_hls.py | 1 | CODE | |
| LOW | tests/plugins/test_ustreamtv.py | 1 | CODE | |
| LOW | tests/plugins/test_http.py | 1 | CODE | |
| LOW | tests/plugins/test_vk.py | 1 | CODE | |
| LOW | tests/plugins/test_soop.py | 1 | CODE | |
| LOW | tests/plugins/test_filmon.py | 1 | CODE | |
| LOW | tests/stream/test_stream_json.py | 1 | CODE | |
| LOW | tests/stream/test_file.py | 1 | CODE | |
| LOW | tests/stream/test_ffmpegmux.py | 1 | CODE | |
| LOW | tests/stream/hls/test_hls.py | 1 | CODE | |
| LOW | tests/stream/hls/test_m3u8.py | 1 | CODE | |
| LOW | tests/stream/dash/test_dash.py | 1 | CODE | |
| LOW | tests/utils/test_num.py | 1 | CODE | |
| LOW | tests/utils/test_named_pipe.py | 1 | CODE | |
| LOW | tests/utils/test_id3v2.py | 1 | CODE | |
| LOW | tests/utils/test_args.py | 1 | CODE | |
| LOW | tests/utils/test_thread.py | 1 | CODE | |
| LOW | tests/utils/test_path.py | 1 | CODE | |
| LOW | tests/utils/test_processoutput.py | 1 | CODE | |
| LOW | tests/utils/test_random.py | 1 | CODE | |
| LOW | tests/utils/test_dataclass.py | 1 | CODE | |
| LOW | tests/cli/test_argparser.py | 1 | CODE | |
| LOW | tests/cli/test_streamrunner.py | 1 | CODE | |
| LOW | tests/cli/test_compat.py | 1 | CODE | |
| LOW | tests/cli/output/test_player.py | 1 | CODE | |
| LOW | tests/cli/output/test_file.py | 1 | CODE | |
| LOW | tests/cli/utils/test_player.py | 1 | CODE | |
| LOW | tests/cli/utils/test_versioncheck.py | 1 | CODE | |
| LOW | tests/cli/utils/test_path.py | 1 | CODE | |
| LOW | tests/cli/main/test_handle_url.py | 1 | CODE | |
| LOW | tests/cli/main/conftest.py | 1 | CODE | |
| LOW | tests/cli/main/test_logging.py | 1 | CODE | |
| LOW | tests/cli/main/test_player_argv.py | 1 | CODE | |
| LOW | tests/cli/main/test_can_handle_url.py | 1 | CODE | |
| LOW | tests/cli/main/test_setup_config_args.py | 1 | CODE | |
| LOW | tests/cli/main/test_show_matchers.py | 1 | CODE | |
| 283 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/stream/dash/test_dash.py | 535 | except StopIteration: | CODE |
| HIGH | tests/utils/test_named_pipe.py | 14 | except ImportError: | CODE |
| HIGH | src/streamlink/cache.py | 97 | except FileNotFoundError: | CODE |
| HIGH | src/streamlink/logger.py | 167 | except OSError: | CODE |
| HIGH | src/streamlink/plugins/vk.py | 65 | except StopIteration: | CODE |
| HIGH | src/streamlink/plugins/vk.py | 77 | except PluginError: | CODE |
| HIGH | src/streamlink/plugins/mdstrm.py | 56 | except ValueError: | CODE |
| HIGH | src/streamlink/plugins/reuters.py | 38 | except PluginError: | CODE |
| HIGH | src/streamlink/plugins/reuters.py | 50 | except PluginError: | CODE |
| HIGH | src/streamlink/plugins/reuters.py | 70 | except PluginError: | CODE |
| HIGH | src/streamlink/plugins/reuters.py | 87 | except PluginError: | CODE |
| HIGH | src/streamlink/plugins/tiktok.py | 64 | except ValueError: | CODE |
| HIGH | src/streamlink/stream/stream.py | 41 | except TypeError: | CODE |
| HIGH | src/streamlink/stream/wrappers.py | 86 | except Exception: | CODE |
| HIGH | src/streamlink/stream/segmented/segmented.py | 300 | except StopIteration: | CODE |
| HIGH | src/streamlink/stream/hls/hls.py | 759 | except TypeError: | CODE |
| HIGH | src/streamlink/stream/hls/m3u8.py | 279 | except BinasciiError: | CODE |
| HIGH | src/streamlink/utils/named_pipe.py | 17 | except ImportError: | CODE |
| HIGH | src/streamlink/session/session.py | 122 | except PluginError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_validate.py | 1558 | """{"a": ["b", true, false, null, 1, 2.3]}""", | STRING |
| HIGH⚡ | tests/test_validate.py | 1650 | self.__next_f.push([1, "a0:[\"$\",\"$L6c\",null,[{\"a\":\"b\"}]]\n\na1:[\"$\",\"$L6c\",null,[{\"c\":\"d\ | CODE |
| HIGH⚡ | tests/test_validate.py | 1650 | self.__next_f.push([1, "a0:[\"$\",\"$L6c\",null,[{\"a\":\"b\"}]]\n\na1:[\"$\",\"$L6c\",null,[{\"c\":\"d\ | CODE |
| HIGH⚡ | tests/test_validate.py | 1658 | self.__next_f.push([1, "a0:I[123,[{\"a\":\"b\"}]]\n\na1:Idiscarded-because-no-json\na2:Z[456,[{\"c\":\"d | CODE |
| HIGH⚡ | tests/test_validate.py | 1666 | self.__next_f.push([1, "a0:T10,[\"foobarfoobar\"]\n\na1:T10,foobar0123456789\na2:Ta0,[\"foobar\"]"]) | CODE |
| HIGH⚡ | tests/test_validate.py | 1672 | validate.validate(validate.nextjs_inline_rsc(), 'self.__next_f.push([0, "foo"])') | STRING |
| HIGH | tests/test_validate.py | 1683 | validate.validate(validate.nextjs_inline_rsc(), 'self.__next_f.push([1, "a0:Tfoo,bar"])') | STRING |
| HIGH | tests/cli/main/test_show_matchers.py | 94 | "name": null, | CODE |
| HIGH | tests/cli/main/test_show_matchers.py | 106 | "name": null, | CODE |
| HIGH | tests/cli/main/test_show_matchers.py | 120 | "name": null, | CODE |
| HIGH | src/streamlink/validate/_validators.py | 611 | assert schema.validate(\"\"\"{"a":[1,2,3],"b":null}\"\"\") == {"a": [1, 2, 3], "b": None} | STRING |
| HIGH⚡ | src/streamlink/validate/_validators.py | 705 | self.__next_f.push([1, "a0:[\\\"$\\\",\\\"$L6c\\\",null,[{\\\"key\\\":\\\"value\\\"}]]"]) | STRING |
| HIGH⚡ | src/streamlink/validate/_validators.py | 705 | self.__next_f.push([1, "a0:[\\\"$\\\",\\\"$L6c\\\",null,[{\\\"key\\\":\\\"value\\\"}]]"]) | STRING |
| HIGH | src/streamlink/plugins/mjunoon.py | 36 | is_live_channel_re = re.compile(r'"isLiveBroadcast":\s*"(true|undefined)"') | CODE |
| HIGH | src/streamlink/plugins/twitch.py | 655 | "body": null, | CODE |
| HIGH | src/streamlink/webbrowser/cdp/devtools/emulation.py | 756 | respective variables to be undefined, even if previously overridden. | STRING |
| HIGH | src/streamlink/webbrowser/cdp/devtools/runtime.py | 494 | unserializable primitive value or neither of (for undefined) them should be specified. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | setup.py | 37 | CODE | |
| LOW | tests/testutils/test_handshake.py | 18 | CODE | |
| LOW | docs/sphinxext/ext_argparse.py | 126 | CODE | |
| LOW | script/github-release.py | 343 | CODE | |
| LOW | script/generate-cdp.py | 551 | CODE | |
| LOW | src/streamlink/validate/_validators.py | 696 | CODE | |
| LOW | src/streamlink/validate/_validators.py | 746 | CODE | |
| LOW | src/streamlink/validate/_validate.py | 89 | CODE | |
| LOW | src/streamlink/plugins/adultswim.py | 164 | CODE | |
| LOW | src/streamlink/plugins/youtube.py | 85 | CODE | |
| LOW | src/streamlink/plugins/ustreamtv.py | 217 | CODE | |
| LOW | src/streamlink/plugins/brightcove.py | 33 | CODE | |
| LOW | src/streamlink/plugins/zattoo.py | 200 | CODE | |
| LOW | src/streamlink/plugins/bbciplayer.py | 135 | CODE | |
| LOW | src/streamlink/plugins/bbciplayer.py | 194 | CODE | |
| LOW | src/streamlink/plugins/nicolive.py | 367 | CODE | |
| LOW | src/streamlink/plugins/abematv.py | 217 | CODE | |
| LOW | src/streamlink/plugins/bilibili.py | 204 | CODE | |
| LOW | src/streamlink/plugins/atresplayer.py | 42 | CODE | |
| LOW | src/streamlink/plugins/dailymotion.py | 53 | CODE | |
| LOW | src/streamlink/plugins/openrectv.py | 140 | CODE | |
| LOW | src/streamlink/plugins/pixiv.py | 115 | CODE | |
| LOW | src/streamlink/plugins/sportschau.py | 64 | CODE | |
| LOW | src/streamlink/plugins/zdf_mediathek.py | 191 | CODE | |
| LOW | src/streamlink/plugins/twitch.py | 912 | CODE | |
| LOW | src/streamlink/plugins/twitch.py | 1002 | CODE | |
| LOW | src/streamlink/plugins/steam.py | 86 | CODE | |
| LOW | src/streamlink/plugins/wwenetwork.py | 81 | CODE | |
| LOW | src/streamlink/stream/hls/hls.py | 388 | CODE | |
| LOW | src/streamlink/stream/hls/hls.py | 829 | CODE | |
| LOW | src/streamlink/stream/hls/m3u8.py | 596 | CODE | |
| LOW | src/streamlink/stream/dash/manifest.py | 425 | CODE | |
| LOW | src/streamlink/stream/dash/dash.py | 111 | CODE | |
| LOW | src/streamlink/stream/dash/dash.py | 292 | CODE | |
| LOW | src/streamlink/plugin/plugin.py | 104 | CODE | |
| LOW | src/streamlink/plugin/plugin.py | 144 | CODE | |
| LOW | src/streamlink/plugin/plugin.py | 392 | CODE | |
| LOW | src/streamlink/packages/requests_file.py | 34 | CODE | |
| LOW | src/streamlink/session/http.py | 138 | CODE | |
| LOW | src/streamlink/session/http.py | 178 | CODE | |
| LOW | src/streamlink_cli/streamrunner.py | 93 | CODE | |
| LOW | src/streamlink_cli/main.py | 118 | CODE | |
| LOW | src/streamlink_cli/main.py | 215 | CODE | |
| LOW | src/streamlink_cli/main.py | 379 | CODE | |
| LOW | src/streamlink_cli/main.py | 445 | CODE | |
| LOW | src/streamlink_cli/main.py | 618 | CODE | |
| LOW | src/streamlink_cli/main.py | 773 | CODE | |
| LOW | src/streamlink_cli/main.py | 1010 | CODE | |
| LOW | src/streamlink_cli/argparser.py | 1651 | CODE | |
| LOW | src/streamlink_cli/output/player.py | 366 | CODE | |
| LOW | src/streamlink_cli/console/console.py | 113 | CODE | |
| LOW | src/streamlink_cli/console/stream.py | 109 | CODE | |
| LOW | src/streamlink_cli/console/stream.py | 130 | CODE | |
| LOW | src/streamlink_cli/console/progress.py | 54 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | script/generate-cdp.py | 80 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/plugin/plugin.py | 494 | # Create the best/worst synonyms | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/fetch.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/input_.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/util.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/security.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/io.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/emulation.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/inspector.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/__init__.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/page.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/runtime.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/debugger.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/browser.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/network.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/target.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| MEDIUM | src/streamlink/webbrowser/cdp/devtools/dom.py | 3 | # This file is generated from the CDP specification. If you need to make | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/resources/__init__.py | 20 | except Exception as err: # pragma: no cover | CODE |
| LOW | tests/testutils/test_handshake.py | 24 | except Exception as err: | CODE |
| MEDIUM | tests/testutils/test_handshake.py | 18 | def run(self): | CODE |
| LOW | docs/sphinxext/ext_argparse.py | 67 | except Exception as err: | CODE |
| LOW | docs/sphinxext/ext_plugins.py | 258 | except Exception as err: | CODE |
| LOW | script/github-release.py | 584 | except Exception: | STRING |
| LOW | script/build-shell-completions.py | 68 | except Exception as err: | CODE |
| LOW | script/test-plugin-urls.py | 167 | except Exception as err: | CODE |
| LOW | script/test-plugin-urls.py | 198 | except Exception: | CODE |
| LOW | script/test-plugin-urls.py | 212 | except Exception: | CODE |
| LOW | script/test-plugin-urls.py | 243 | except Exception as err: | CODE |
| MEDIUM | script/test-plugin-urls.py | 229 | def main(self) -> int: | CODE |
| LOW | src/streamlink/cache.py | 99 | except Exception as err: | CODE |
| LOW | src/streamlink/cache.py | 145 | except Exception as err: | CODE |
| LOW | src/streamlink/plugins/douyu.py | 93 | except Exception: | CODE |
| LOW | src/streamlink/plugins/zattoo.py | 292 | except Exception: | STRING |
| LOW | src/streamlink/plugins/bbciplayer.py | 154 | except Exception: | CODE |
| LOW | src/streamlink/plugins/kick.py | 207 | except Exception as err: | STRING |
| LOW | src/streamlink/plugins/kick.py | 256 | except Exception as err: | STRING |
| LOW | src/streamlink/plugins/twitch.py | 715 | except Exception as err: | STRING |
| LOW | src/streamlink/plugins/twitcasting.py | 146 | except Exception as err: | CODE |
| LOW | src/streamlink/stream/wrappers.py | 86 | except Exception: | CODE |
| LOW | src/streamlink/stream/hls/hls.py | 411 | except Exception as err: | CODE |
| LOW | src/streamlink/stream/hls/hls.py | 812 | except Exception: | CODE |
| LOW | src/streamlink/stream/hls/hls.py | 823 | except Exception: | CODE |
| LOW | src/streamlink/stream/dash/dash.py | 317 | except Exception as err: | CODE |
| LOW | src/streamlink/plugin/api/webbrowser/aws_waf.py | 73 | except Exception as err: | CODE |
| LOW | src/streamlink/utils/formatter.py | 47 | except Exception: | CODE |
| LOW | src/streamlink/utils/processoutput.py | 91 | except Exception: | CODE |
| LOW | src/streamlink/utils/parse.py | 15 | except Exception as err: | CODE |
| MEDIUM | src/streamlink/utils/parse.py | 12 | def _parse(parser, data, name, exception, schema, *args, **kwargs): | CODE |
| LOW | src/streamlink/webbrowser/cdp/connection.py | 255 | except Exception as err: | CODE |
| MEDIUM | src/streamlink/webbrowser/cdp/connection.py | 94 | def __anext__(self) -> TCDPEvent: | CODE |
| LOW | src/streamlink/session/plugins.py | 288 | except Exception: | CODE |
| LOW | src/streamlink/session/plugins.py | 294 | except Exception: | CODE |
| LOW | src/streamlink/session/http.py | 267 | except Exception as err: | CODE |
| LOW | src/streamlink/session/http.py | 390 | except Exception as rerr: | CODE |
| LOW | src/streamlink_cli/main.py | 604 | except Exception: | CODE |
| LOW | src/streamlink_cli/main.py | 967 | except Exception as err: | CODE |
| LOW | src/streamlink_cli/main.py | 1004 | except Exception as err: | CODE |
| LOW | src/streamlink_cli/utils/versioncheck.py | 33 | except Exception as err: | CODE |
| MEDIUM | src/streamlink_cli/utils/versioncheck.py | 25 | def get_latest() -> str: | CODE |
| LOW | src/streamlink_cli/console/console.py | 89 | except Exception as err: | CODE |
| LOW | src/streamlink_cli/console/progress.py | 97 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | build_backend/commands.py | 15 | __all__ = ["cmdclass"] | CODE |
| LOW | script/github-release.py | 282 | def update_release(self, release_id: int, payload: dict) -> None: | STRING |
| LOW | script/generate-cdp.py | 71 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/streamlink/options.py | 76 | def set_explicit(self, key: str, value: Any) -> None: | CODE |
| LOW | src/streamlink/options.py | 310 | __all__ = [ | CODE |
| LOW | src/streamlink/compat.py | 98 | __all__ = [ | CODE |
| LOW | src/streamlink/cache.py | 246 | __all__ = ["Cache"] | CODE |
| LOW | src/streamlink/logger.py | 295 | __all__ = [ | CODE |
| LOW | src/streamlink/exceptions.py | 53 | __all__ = [ | CODE |
| LOW | src/streamlink/buffers.py | 163 | __all__ = ["Buffer", "RingBuffer"] | CODE |
| LOW | src/streamlink/stream/stream.py | 75 | __all__ = ["Stream", "StreamIO"] | CODE |
| LOW | src/streamlink/stream/wrappers.py | 110 | __all__ = ["StreamIOWrapper", "StreamIOIterWrapper", "StreamIOThreadWrapper"] | CODE |
| LOW | src/streamlink/plugin/__init__.py | 14 | __all__ = [ | CODE |
| LOW | src/streamlink/plugin/plugin.py | 353 | def set_option(self, key: str, value: Any) -> None: | CODE |
| LOW | src/streamlink/plugin/plugin.py | 807 | __all__ = [ | CODE |
| LOW | src/streamlink/utils/times.py | 138 | __all__ = [ | STRING |
| LOW | src/streamlink/utils/args.py | 101 | __all__ = [ | CODE |
| LOW | src/streamlink/webbrowser/cdp/client.py | 444 | async def _update_user_agent(self) -> None: | CODE |
| LOW | src/streamlink/webbrowser/cdp/connection.py | 111 | def set_response(self, response: TCmdResponse | Exception) -> None: | CODE |
| LOW | src/streamlink/session/session.py | 61 | def set_option(self, key: str, value: Any) -> None: | CODE |
| LOW | src/streamlink/session/session.py | 204 | __all__ = ["Streamlink"] | CODE |
| LOW | src/streamlink/session/http.py | 178 | def set_interface(self, interface: str | None) -> None: | CODE |
| LOW | src/streamlink/session/http.py | 241 | def set_address_family(self, family: socket.AddressFamily | None = None) -> None: | CODE |
| LOW | src/streamlink/session/http.py | 463 | __all__ = ["HTTPSession", "SSLContextAdapter", "TLSNoDHAdapter", "TLSSecLevel1Adapter"] | CODE |
| LOW | src/streamlink_cli/compat.py | 17 | __all__ = [ | CODE |
| LOW | src/streamlink_cli/constants.py | 58 | __all__ = [ | CODE |
| LOW | src/streamlink_cli/argparser.py | 1713 | __all__ = ["ArgumentParser", "build_parser", "setup_session_options", "setup_plugin_args", "setup_plugin_options"] | CODE |
| LOW | src/streamlink_cli/utils/__init__.py | 10 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | tests/cli/main/conftest.py | 91 | streamlink_cli.main.logger.root.handlers.clear() | CODE |
| CRITICAL | src/streamlink/webbrowser/cdp/client.py | 478 | self.cdp_client.streamlink.http.cookies.set( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_logger.py | 36 | CODE | |
| LOW | src/streamlink/options.py | 101 | CODE | |
| LOW | src/streamlink/logger.py | 241 | CODE | |
| LOW | src/streamlink/plugins/ustvnow.py | 138 | CODE | |
| LOW | src/streamlink/plugin/plugin.py | 714 | CODE | |
| LOW | src/streamlink/plugin/api/websocket.py | 54 | CODE | |
| LOW | src/streamlink/webbrowser/cdp/devtools/input_.py | 235 | CODE | |
| LOW | src/streamlink/webbrowser/cdp/devtools/input_.py | 363 | CODE | |
| LOW | src/streamlink/webbrowser/cdp/devtools/input_.py | 594 | CODE | |
| LOW | src/streamlink/webbrowser/cdp/devtools/emulation.py | 771 | CODE | |
| LOW | src/streamlink/webbrowser/cdp/devtools/page.py | 2552 | CODE | |
| LOW | src/streamlink/webbrowser/cdp/devtools/page.py | 2836 | CODE | |
| LOW | src/streamlink/webbrowser/cdp/devtools/runtime.py | 839 | CODE | |
| LOW | src/streamlink/webbrowser/cdp/devtools/runtime.py | 980 | CODE | |
| LOW | src/streamlink/webbrowser/cdp/devtools/network.py | 3134 | CODE | |
| LOW | src/streamlink/webbrowser/cdp/devtools/target.py | 355 | CODE | |
| LOW | src/streamlink/session/http.py | 322 | CODE | |
| LOW | src/streamlink_cli/output/player.py | 219 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | pyproject.toml | 0 | streamlink is a command-line utility that extracts streams from various services and pipes them into a video player of c | STRING |
| HIGH | tests/cli/main/test_logging.py | 0 | streamlink is a command-line utility that extracts streams from various services and pipes them into a video player of c | STRING |
| HIGH | src/streamlink_cli/argparser.py | 0 | streamlink is a command-line utility that extracts streams from various services and pipes them into a video player of c | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | build_backend/__init__.py | 21 | config_settings: dict | None = None, | COMMENT |
| LOW | script/generate-cdp.py | 1 | #!/usr/bin/env python | COMMENT |
| LOW | src/streamlink/plugins/twitch.py | 101 | # Use the average duration of all regular segments for the duration of prefetch segments. | COMMENT |
| LOW | src/streamlink/utils/url.py | 41 | # urlparse("127.0.0.1:1234") == ParseResult(scheme='127.0.0.1', netloc='', path='1234/foo', ...) | COMMENT |
| LOW | src/streamlink/webbrowser/chromium.py | 101 | # Disable some built-in extensions that aren't affected by `--disable-extensions` | COMMENT |
| LOW | src/streamlink/webbrowser/cdp/connection.py | 121 | # Copyright (c) 2018 Hyperion Gray | COMMENT |
| LOW | src/streamlink/webbrowser/cdp/devtools/network.py | 3541 | #: Each request the page makes will have a unique id, however if any redirects are encountered | COMMENT |
| LOW | src/streamlink/webbrowser/cdp/devtools/network.py | 4241 | COMMENT | |
| LOW | src/streamlink/session/http.py | 61 | return socket.AF_INET | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/conftest.py | 90 | # ======================== | COMMENT |
| MEDIUM | tests/conftest.py | 92 | # ======================== | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/streamlink/plugins/bloomberg.py | 156 | # just return the first stream | COMMENT |
| LOW | src/streamlink/plugins/nrk.py | 106 | # just return the first item | COMMENT |
| LOW | src/streamlink/plugins/twitch.py | 1033 | # Don't raise and simply return no streams on 4xx/5xx playlist responses | STRING |
| LOW | src/streamlink/plugins/pandalive.py | 133 | # all stream qualities share the same URL, so just use the first one | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/plugins/test_ustvnow.py | 20 | b'{"login_id":"test@test.com","login_key":"testtest1234","login_mode":"1","manufacturer":"123"}', | CODE |
| LOW | src/streamlink/plugins/radiko.py | 78 | "x-radiko-user": "dummy_user", | CODE |
| LOW | src/streamlink/plugins/radiko.py | 90 | "x-radiko-user": "dummy_user", | CODE |
| LOW | src/streamlink/webbrowser/cdp/devtools/dom.py | 119 | PLACEHOLDER = "placeholder" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/streamlink/plugins/twitch.py | 1008 | # Check if the media playlists are accessible: | STRING |
| LOW | src/streamlink/packages/requests_file.py | 67 | # Open the file, translate certain errors into HTTP responses | COMMENT |
| LOW | src/streamlink/packages/requests_file.py | 109 | # Check if the drive assumptions above were correct. If path_drive | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/streamlink/stream/segmented/segmented.py | 269 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/streamlink/webbrowser/cdp/devtools/runtime.py | 144 | #: NOTE: If you change anything here, make sure to also update | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/streamlink_cli/streamrunner.py | 108 | # TODO: Fix error messages (s/when/while/) and only log "Stream ended" when it ended on its own (data == b""). | COMMENT |