Repository Analysis

ihmily/StreamCap

Multi-Platform Live Stream Automatic Recording Tool | 多平台直播流自动录制客户端 · 基于FFmpeg · 支持监控/定时/转码

15.8 Moderate AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of ihmily/StreamCap, a Python project with 3,960 GitHub stars. SynthScan v2.0 examined 17,426 lines of code across 132 source files, recording 262 pattern matches distributed across 8 syntactic categories. The overall adjusted score of 15.8 places this repository in the Moderate 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).

15.8
Adjusted Score
15.8
Raw Score
100%
Time Factor
2026-07-12
Last Push
4.0K
Stars
Python
Language
17.4K
Lines of Code
132
Files
262
Pattern Hits
2026-07-14
Scan Date
0.00
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.

No multi-scan history yet — run the scanner again to build trend data.

Severity Breakdown

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.

CRITICAL 0HIGH 0MEDIUM 13LOW 249

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 262 distinct pattern matches across 8 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.

Excessive Try-Catch Wrapping95 hits · 114 pts
SeverityFileLineSnippetContext
LOWmain.py148 except Exception as e:CODE
LOWmain.py186 except Exception as err:CODE
LOWapp/app_manager.py118 except Exception:CODE
LOWapp/app_manager.py127 except Exception as exc:CODE
LOWapp/app_manager.py136 except Exception as exc:CODE
LOWapp/app_manager.py145 except Exception as exc:CODE
LOWapp/app_manager.py151 except Exception as exc:CODE
LOWapp/app_manager.py192 except Exception as e:CODE
LOWapp/app_manager.py215 except Exception as e:CODE
LOWapp/ui/components/business/video_player.py118 except Exception as e:CODE
LOWapp/ui/components/business/video_player.py140 except Exception as e:CODE
LOWapp/ui/components/business/recording_card.py377 except Exception as e:CODE
LOWapp/ui/components/business/recording_card.py252 except Exception as e:CODE
LOWapp/ui/components/business/recording_card.py296 except Exception as e:CODE
LOWapp/ui/components/business/recording_card.py421 except Exception as e:CODE
LOWapp/ui/components/business/recording_card.py440 except Exception as e:CODE
LOWapp/ui/components/business/recording_card.py496 except Exception as e:CODE
LOWapp/ui/views/storage_view.py82 except Exception as e:CODE
LOWapp/ui/views/storage_view.py95 except Exception:CODE
LOWapp/ui/views/storage_view.py108 except Exception as e:CODE
MEDIUMapp/ui/views/storage_view.py53def update_file_list(self):CODE
MEDIUMapp/ui/views/storage_view.py101def _get_items():CODE
LOWapp/messages/notification_service.py25 except Exception as e:CODE
LOWapp/messages/notification_service.py116 except Exception as e:CODE
LOWapp/messages/desktop_notify.py19 except Exception:CODE
LOWapp/core/update/update_checker.py59 except Exception as e:CODE
LOWapp/core/update/update_checker.py126 except Exception as e:CODE
LOWapp/core/update/update_checker.py164 except Exception as e:CODE
LOWapp/core/update/update_checker.py199 except Exception as e:CODE
MEDIUMapp/core/update/update_checker.py53def _get_current_version(self) -> str:CODE
LOWapp/core/config/config_manager.py47 except Exception as e:CODE
LOWapp/core/config/config_manager.py87 except Exception as e:CODE
LOWapp/core/config/config_manager.py145 except Exception as e:CODE
LOWapp/core/recording/record_manager.py523 except Exception:CODE
LOWapp/core/recording/stream_manager.py164 except Exception as e:CODE
LOWapp/core/recording/stream_manager.py187 except Exception as e:CODE
LOWapp/core/recording/stream_manager.py284 except Exception as e:CODE
LOWapp/core/recording/stream_manager.py336 except Exception as e:CODE
LOWapp/core/recording/stream_manager.py471 except Exception as e:CODE
LOWapp/core/recording/stream_manager.py479 except Exception as e:CODE
LOWapp/core/recording/stream_manager.py497 except Exception as e:CODE
LOWapp/core/recording/stream_manager.py508 except Exception as e:CODE
LOWapp/core/recording/stream_manager.py601 except Exception as e:CODE
LOWapp/core/recording/stream_manager.py677 except Exception as e:CODE
LOWapp/core/recording/stream_manager.py766 except Exception as e:CODE
LOWapp/core/recording/stream_manager.py774 except Exception as e:CODE
MEDIUMapp/core/recording/stream_manager.py331def remove_active_recorder(self):CODE
LOWapp/core/runtime/backend_services.py102 except Exception as exc: # pragma: no cover - defensiveCODE
LOWapp/core/runtime/backend_services.py107 except Exception:CODE
LOWapp/core/runtime/backend_services.py121 except Exception as exc: # pragma: no cover - defensiveCODE
LOWapp/core/runtime/backend_services.py137 except Exception as exc:CODE
LOWapp/core/runtime/backend_services.py141 except Exception:CODE
LOWapp/core/runtime/backend_services.py151 except Exception:CODE
LOWapp/core/runtime/backend_services.py171 except Exception as exc:CODE
LOWapp/core/runtime/backend_services.py178 except Exception as exc:CODE
LOWapp/core/runtime/backend_services.py185 except Exception as exc:CODE
LOWapp/core/runtime/backend_services.py192 except Exception as exc:CODE
LOWapp/core/runtime/process_manager.py45 except Exception as e:CODE
LOWapp/core/runtime/process_manager.py79 except Exception as e:CODE
LOWapp/core/media/direct_downloader.py49 except Exception as e:CODE
35 more matches not shown…
Hyper-Verbose Identifiers56 hits · 61 pts
SeverityFileLineSnippetContext
LOWapp/ui/filters/recording_filters.py48 def get_platform_filter_result(cls, recording, platform_filter) -> bool:CODE
LOWapp/ui/components/business/recording_dialog.py140 async def on_segment_setting_change(e):CODE
LOWapp/ui/components/business/recording_dialog.py185 def create_time_picker_handler(index):CODE
LOWapp/ui/components/business/recording_dialog.py234 async def on_scheduled_setting_change(e):CODE
LOWapp/ui/components/business/recording_card.py385 def get_icon_for_recording_state(recording: Recording):CODE
LOWapp/ui/components/business/recording_card.py389 def get_tip_for_recording_state(self, recording: Recording):CODE
LOWapp/ui/components/business/recording_card.py393 def get_icon_for_monitor_state(recording: Recording):CODE
LOWapp/ui/components/business/recording_card.py397 def get_tip_for_monitor_state(self, recording: Recording):CODE
LOWapp/ui/components/business/recording_card.py520 async def recording_button_on_click(self, _, recording: Recording):CODE
LOWapp/ui/components/business/recording_card.py523 async def recording_dir_button_on_click(self, _, recording: Recording):CODE
LOWapp/ui/components/business/recording_card.py526 async def recording_info_button_on_click(self, _, recording: Recording):CODE
LOWapp/ui/components/business/recording_card.py171 def get_card_background_color(self, recording: Recording):CODE
LOWapp/ui/components/business/recording_card.py284 async def show_recording_info_dialog(self, recording: Recording):CODE
LOWapp/ui/components/business/recording_card.py451 async def edit_recording_button_click(self, _, recording: Recording):CODE
LOWapp/ui/components/business/recording_card.py464 async def recording_delete_button_click(self, _, recording: Recording):CODE
LOWapp/ui/components/business/recording_card.py499 async def preview_video_button_on_click(self, _, recording: Recording):CODE
LOWapp/ui/views/storage_view.py140 def show_empty_folder_message(self):CODE
LOWapp/ui/views/home_view.py271 def create_announcements_area(self):CODE
LOWapp/ui/views/home_view.py669 async def on_browse_recordings_click(self, _):CODE
LOWapp/ui/views/settings_view.py209 async def save_user_config_after_delay(self, delay):CODE
LOWapp/ui/views/settings_view.py219 async def save_accounts_after_delay(self, delay):CODE
LOWapp/ui/views/settings_view.py231 def get_supported_record_format() -> list:CODE
LOWapp/ui/views/settings_view.py234 def create_recording_settings_tab(self):CODE
LOWapp/ui/views/settings_view.py894 def create_push_channels_layout(self):CODE
LOWapp/ui/views/settings_view.py931 def create_cookies_settings_tab(self):CODE
LOWapp/ui/views/settings_view.py1001 def create_accounts_settings_tab(self):CODE
LOWapp/ui/views/settings_view.py1102 def create_folder_setting_row(self, label):CODE
LOWapp/ui/views/settings_view.py1159 def create_channel_switch_container(self, channel_name, icon, key):CODE
LOWapp/ui/views/settings_view.py1364 def create_security_settings_tab(self):CODE
LOWapp/ui/views/recordings_view.py115 def create_recordings_title_area(self):CODE
LOWapp/ui/views/recordings_view.py332 async def filter_recording_on_click(self, _):CODE
LOWapp/ui/views/recordings_view.py415 def create_recordings_content_area(self):CODE
LOWapp/ui/views/recordings_view.py442 async def create_card_with_time_range(_recording: Recording):CODE
LOWapp/ui/views/recordings_view.py534 async def create_card_with_time_range(rec):CODE
LOWapp/ui/views/recordings_view.py598 async def start_monitor_recordings_on_click(self, _):CODE
LOWapp/ui/views/recordings_view.py604 async def stop_monitor_recordings_on_click(self, _):CODE
LOWapp/ui/views/recordings_view.py608 async def delete_monitor_recordings_on_click(self, _):CODE
LOWapp/ui/views/recordings_view.py651 async def delete_all_recording_cards(self):CODE
LOWapp/ui/views/recordings_view.py705 def get_grid_child_aspect_ratio(self):CODE
LOWapp/ui/views/recordings_view.py746 def on_platform_dropdown_change(self, e):CODE
LOWapp/messages/message_pusher.py32 def is_any_push_channel_enabled(self) -> bool:CODE
LOWapp/core/config/language_manager.py33 def _initialize_observer_registry(self) -> None:CODE
LOWapp/core/recording/record_manager.py230 def set_periodic_task_running(cls, value=True):CODE
LOWapp/core/recording/record_manager.py233 async def setup_periodic_live_check(self, interval: int = 180):CODE
LOWapp/core/recording/stream_manager.py151 def _clean_and_truncate_title(title: str) -> str | None:CODE
LOWapp/core/recording/stream_manager.py167 async def _handle_recording_finished(self, record_name: str, stop_msg: str = "", complete_msg: str = "") -> None:CODE
LOWapp/core/recording/stream_manager.py191 def is_flv_preferred_platform(self):CODE
LOWapp/core/runtime/paths.py15def _macos_bundle_contents_dir(executable_dir: Path) -> Path | None:CODE
LOWapp/core/runtime/bundled_env.py8def patch_macos_flet_launcher() -> None:CODE
LOWapp/core/runtime/bundled_env.py49 def has_materialized_framework_links(app_path: Path) -> bool:CODE
LOWapp/core/runtime/bundled_env.py63 def write_file_picker_entitlements(target_dir: Path) -> Path:CODE
LOWapp/core/runtime/bundled_env.py72 def prepare_streamcap_flet_app() -> Path:CODE
LOWapp/core/media/ffmpeg_builders/base.py63 def _get_basic_ffmpeg_command(self) -> list[str]:CODE
LOWapp/utils/utils.py217def is_current_time_within_range(time_range_str: str):CODE
LOWapp/utils/utils.py231def is_time_interval_exceeded(last_check_time, interval_seconds=60):CODE
LOWapp/initialization/installation_manager.py81 async def update_component_progress(self, component_name, progress, status):CODE
Unused Imports74 hits · 57 pts
SeverityFileLineSnippetContext
LOWapp/__init__.py2CODE
LOWapp/ui/filters/__init__.py1CODE
LOWapp/ui/themes/__init__.py1CODE
LOWapp/ui/themes/__init__.py2CODE
LOWapp/core/__init__.py1CODE
LOWapp/core/platforms/platform_handlers/__init__.py2CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/platforms/platform_handlers/__init__.py3CODE
LOWapp/core/config/settings_config.py1CODE
LOWapp/core/runtime/backend_services.py1CODE
14 more matches not shown…
Deep Nesting23 hits · 22 pts
SeverityFileLineSnippetContext
LOWmain.py134CODE
LOWmain.py160CODE
LOWapp/ui/components/business/recording_dialog.py26CODE
LOWapp/ui/components/business/recording_dialog.py369CODE
LOWapp/ui/components/business/recording_card.py197CODE
LOWapp/ui/components/business/recording_card.py315CODE
LOWapp/ui/components/business/recording_card.py499CODE
LOWapp/ui/components/state/recording_card_state.py11CODE
LOWapp/ui/components/dialogs/search_dialog.py5CODE
LOWapp/ui/views/home_view.py352CODE
LOWapp/ui/views/recordings_view.py727CODE
LOWapp/core/update/update_checker.py132CODE
LOWapp/core/update/update_checker.py204CODE
LOWapp/core/update/update_checker.py284CODE
LOWapp/core/update/update_checker.py207CODE
LOWapp/core/config/config_manager.py122CODE
LOWapp/core/recording/stream_manager.py219CODE
LOWapp/core/recording/stream_manager.py365CODE
LOWapp/core/recording/stream_manager.py544CODE
LOWapp/core/runtime/process_manager.py59CODE
LOWapp/scripts/ffmpeg_install.py72CODE
LOWapp/scripts/ffmpeg_install.py161CODE
LOWapp/scripts/node_install.py49CODE
Modern Structural Boilerplate6 hits · 6 pts
SeverityFileLineSnippetContext
LOWapp/__init__.py9__all__ = ["InstallationManager", "execute_dir", "resource_dir"]CODE
LOWapp/ui/filters/__init__.py3__all__ = ["RecordingFilters"]CODE
LOWapp/ui/themes/__init__.py4__all__ = ["PopupColorItem", "ThemeManager"]CODE
LOWapp/core/__init__.py3__all__ = ["get_platform_handler"]CODE
LOWapp/core/platforms/platform_handlers/__init__.py149__all__ = [CODE
LOWapp/api/video_stream_service.py34logger = logging.getLogger(__name__)CODE
Verbosity Indicators3 hits · 6 pts
SeverityFileLineSnippetContext
LOW.github/workflows/sync.yml24 # Step 1: run a standard checkout action, provided by githubCOMMENT
LOW.github/workflows/sync.yml34 # Step 2: run the sync actionCOMMENT
LOW.github/workflows/sync.yml48 # Step 3: Display a sample message based on the sync output var 'has_new_commits'COMMENT
Structural Annotation Overuse3 hits · 6 pts
SeverityFileLineSnippetContext
LOW.github/workflows/sync.yml24 # Step 1: run a standard checkout action, provided by githubCOMMENT
LOW.github/workflows/sync.yml34 # Step 2: run the sync actionCOMMENT
LOW.github/workflows/sync.yml48 # Step 3: Display a sample message based on the sync output var 'has_new_commits'COMMENT
AI Structural Patterns2 hits · 2 pts
SeverityFileLineSnippetContext
LOWapp/messages/notification_service.py120CODE
LOWapp/messages/notification_service.py157CODE