Streamlink is a CLI utility which pipes video streams from various services into a video player
This report presents the forensic synthetic code analysis of streamlink/streamlink, a Python project with 11,627 GitHub stars. SynthScan v2.0 examined 97,261 lines of code across 552 source files, recording 866 pattern matches distributed across 18 syntactic categories. The overall adjusted score of 9.8 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 866 distinct pattern matches across 18 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| 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 | 19 | 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 | 1697 | 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 | 484 | 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 | 212 | def test_hls_daterange_unknown(self): | CODE |
| LOW | tests/plugins/test_twitch.py | 233 | def test_hls_daterange_by_class(self): | CODE |
| LOW | tests/plugins/test_twitch.py | 328 | def test_hls_has_preroll_and_midroll(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 381 | def test_hls_low_latency_has_prefetch(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 404 | def test_hls_no_low_latency_has_prefetch(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 427 | def test_hls_low_latency_no_prefetch(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 447 | def test_hls_low_latency_has_prefetch_has_preroll(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 470 | def test_hls_low_latency_has_prefetch_no_preroll_with_prefetch_ads(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 513 | def test_hls_low_latency_no_prefetch_has_preroll(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 536 | def test_hls_low_latency_no_ads_reload_time(self): | CODE |
| LOW | tests/plugins/test_twitch.py | 550 | def test_hls_prefetch_after_discontinuity(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 567 | def test_hls_ignored_discontinuity(self, mock_log): | CODE |
| LOW | tests/plugins/test_twitch.py | 935 | def test_integrity_check_not_forced(self, plugin: Twitch, mock: rm.Mocker): | CODE |
| LOW | tests/plugins/test_twitch.py | 970 | def test_integrity_check_forced(self, plugin: Twitch, mock: rm.Mocker): | CODE |
| LOW | tests/plugins/test_twitch.py | 1086 | def test_multivariant_response( | CODE |
| LOW | tests/plugins/test_twitch.py | 1228 | def test_metadata_channel_no_data(self, mock_request_channel, metadata): | CODE |
| LOW | tests/plugins/test_twitch.py | 1251 | def test_metadata_video_no_data(self, mock_request_video, metadata): | CODE |
| LOW | tests/plugins/test_twitch.py | 1273 | 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 |
| LOW⚡ | tests/plugins/__init__.py | 167 | def test_url_matches_groups_named(self, name: TName, url: TUrl, groups: TMatchGroup): | CODE |
| LOW⚡ | tests/plugins/__init__.py | 173 | def test_url_matches_negative(self, url: TUrl): | CODE |
| LOW | tests/plugins/test_rtve.py | 24 | def test_translate_no_content(): | CODE |
| LOW | tests/plugins/test_rtve.py | 28 | def test_translate_no_streams(): | CODE |
| LOW | tests/plugins/test_rtve.py | 46 | def test_translate_has_streams(): | CODE |
| LOW | tests/plugins/test_kick.py | 71 | def test_hls_low_latency_has_prefetch(self, mock_log): | CODE |
| 277 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | setup.py | 34 | CODE | |
| LOW | setup.py | 79 | CODE | |
| LOW | build_backend/onbuild.py | 1 | CODE | |
| LOW | build_backend/test_plugins_json.py | 1 | CODE | |
| LOW | build_backend/__init__.py | 1 | CODE | |
| LOW | build_backend/__init__.py | 12 | 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_args.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 | |
| LOW | tests/cli/main/test_output_stream_passthrough.py | 1 | CODE | |
| LOW | tests/cli/main/test_setup_session_options.py | 1 | CODE | |
| 270 more matches not shown… | ||||
| 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/_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/filmon.py | 75 | CODE | |
| LOW | src/streamlink/plugins/filmon.py | 208 | 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/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 | 27 | CODE | |
| LOW | src/streamlink/plugins/twitch.py | 889 | CODE | |
| LOW | src/streamlink/plugins/twitch.py | 979 | CODE | |
| LOW | src/streamlink/plugins/steam.py | 86 | CODE | |
| LOW | src/streamlink/plugins/wwenetwork.py | 81 | CODE | |
| LOW | src/streamlink/stream/hls/hls.py | 313 | CODE | |
| LOW | src/streamlink/stream/hls/hls.py | 734 | CODE | |
| LOW | src/streamlink/stream/hls/m3u8.py | 592 | CODE | |
| LOW | src/streamlink/stream/dash/manifest.py | 421 | CODE | |
| LOW | src/streamlink/stream/dash/dash.py | 111 | CODE | |
| LOW | src/streamlink/stream/dash/dash.py | 290 | 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 | 129 | CODE | |
| LOW | src/streamlink/session/http.py | 169 | CODE | |
| LOW | src/streamlink_cli/streamrunner.py | 93 | CODE | |
| LOW | src/streamlink_cli/main.py | 117 | CODE | |
| LOW | src/streamlink_cli/main.py | 214 | CODE | |
| LOW | src/streamlink_cli/main.py | 378 | CODE | |
| LOW | src/streamlink_cli/main.py | 444 | CODE | |
| LOW | src/streamlink_cli/main.py | 617 | CODE | |
| LOW | src/streamlink_cli/main.py | 768 | CODE | |
| LOW | src/streamlink_cli/main.py | 1000 | CODE | |
| LOW | src/streamlink_cli/argparser.py | 1634 | 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/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 | 77 | except Exception: | CODE |
| LOW | src/streamlink/plugins/filmon.py | 252 | 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 | 204 | except Exception as err: | STRING |
| LOW | src/streamlink/plugins/kick.py | 253 | except Exception as err: | STRING |
| LOW | src/streamlink/plugins/twitch.py | 706 | 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 | 336 | except Exception as err: | CODE |
| LOW | src/streamlink/stream/hls/hls.py | 717 | except Exception: | CODE |
| LOW | src/streamlink/stream/hls/hls.py | 728 | except Exception: | CODE |
| LOW | src/streamlink/stream/dash/dash.py | 315 | 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 | 258 | except Exception as err: | CODE |
| LOW | src/streamlink/session/http.py | 346 | except Exception as rerr: | CODE |
| LOW | src/streamlink_cli/main.py | 603 | except Exception: | CODE |
| LOW | src/streamlink_cli/main.py | 962 | except Exception as err: | CODE |
| LOW | src/streamlink_cli/main.py | 994 | 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 |
|---|---|---|---|---|
| HIGH | tests/test_validate.py | 1544 | """{"a": ["b", true, false, null, 1, 2.3]}""", | 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 | 607 | assert schema.validate(\"\"\"{"a":[1,2,3],"b":null}\"\"\") == {"a": [1, 2, 3], "b": None} | 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 | 648 | "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 | 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 | 298 | __all__ = [ | CODE |
| LOW | src/streamlink/exceptions.py | 60 | __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 | 169 | def set_interface(self, interface: str | None) -> None: | CODE |
| LOW | src/streamlink/session/http.py | 232 | def set_address_family(self, family: socket.AddressFamily | None = None) -> None: | CODE |
| LOW | src/streamlink/session/http.py | 419 | __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 | 1696 | __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 | 90 | 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 | 244 | 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 | 278 | 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 | ) -> list[str]: # pragma: no cover | 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 | 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 | 1010 | # 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 | 985 | # 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 |