Repository Analysis

4gray/iptvnator

:tv: Cross-platform IPTV player application with multiple features, such as support of m3u and m3u8 playlists, favorites, TV guide, TV archive/catchup and more.

2.6 Likely human-written View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of 4gray/iptvnator, a TypeScript project with 6,565 GitHub stars. SynthScan v2.0 examined 297,010 lines of code across 1479 source files, recording 490 pattern matches distributed across 7 syntactic categories. The overall adjusted score of 2.6 places this repository in the Likely human-written 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).

2.6
Adjusted Score
2.6
Raw Score
100%
Time Factor
2026-07-13
Last Push
6.6K
Stars
TypeScript
Language
297.0K
Lines of Code
1.5K
Files
490
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

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.

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 1HIGH 0MEDIUM 119LOW 370

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 490 distinct pattern matches across 7 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.

Decorative Section Separators119 hits · 368 pts
SeverityFileLineSnippetContext
MEDIUMlibs/ui/styles/_index.scss1// ─── IPTVnator UI styles library ─────────────────────────────────────────────COMMENT
MEDIUMlibs/ui/styles/_portal-sidebar.scss1// ─── Shared sidebar + sidebar-header styles ───────────────────────────────────COMMENT
MEDIUMlibs/ui/styles/_portal-layout.scss1// ─── Shared mixin for live-stream portal layouts ──────────────────────────────COMMENT
MEDIUMlibs/ui/styles/_portal-layout.scss20 // ─── Sidebar ─────────────────────────────────────────────────────────────COMMENT
MEDIUMlibs/ui/styles/_portal-layout.scss58 // ─── Main content column ─────────────────────────────────────────────────COMMENT
MEDIUMlibs/ui/styles/_portal-layout.scss68 // ─── Floating restore handle (visible when sidebar is collapsed) ─────────COMMENT
MEDIUMlibs/ui/styles/_portal-layout.scss169 // ─── Fix artplayer sizing when nested inside .video-player ───────────────COMMENT
MEDIUM…l-list-container/channel-list-container.component.scss71// ─── Header ───────────────────────────────────────────────────────────────────COMMENT
MEDIUM…l-list-container/channel-list-container.component.scss92// ─── Divider ──────────────────────────────────────────────────────────────────COMMENT
MEDIUM…l-details-dialog/channel-details-dialog.component.scss6// ─── Hero header ────────────────────────────────────────────────────────────COMMENT
MEDIUM…l-details-dialog/channel-details-dialog.component.scss82// ─── Status pills ───────────────────────────────────────────────────────────COMMENT
MEDIUM…l-details-dialog/channel-details-dialog.component.scss125// ─── Hero stat cards ────────────────────────────────────────────────────────COMMENT
MEDIUM…l-details-dialog/channel-details-dialog.component.scss191// ─── Content area ───────────────────────────────────────────────────────────COMMENT
MEDIUM…l-details-dialog/channel-details-dialog.component.scss204// ─── URL block ──────────────────────────────────────────────────────────────COMMENT
MEDIUM…l-details-dialog/channel-details-dialog.component.scss235// ─── Detail panels ──────────────────────────────────────────────────────────COMMENT
MEDIUM…l-details-dialog/channel-details-dialog.component.scss271// ─── Detail rows ────────────────────────────────────────────────────────────COMMENT
MEDIUM…l-details-dialog/channel-details-dialog.component.scss320// ─── Chip sections (sub-group headers) ──────────────────────────────────────COMMENT
MEDIUM…l-details-dialog/channel-details-dialog.component.scss338// ─── Footer actions ─────────────────────────────────────────────────────────COMMENT
MEDIUM…l-details-dialog/channel-details-dialog.component.scss353// ─── Responsive breakpoints ─────────────────────────────────────────────────COMMENT
MEDIUM…yback/src/lib/audio-player/audio-player.component.scss1// ─── Radio Player — cinematic hero layout ────────────────────────────────────COMMENT
MEDIUM…yback/src/lib/audio-player/audio-player.component.scss12// ─── Hero container ──────────────────────────────────────────────────────────COMMENT
MEDIUM…yback/src/lib/audio-player/audio-player.component.scss21// ─── Blurred backdrop (station logo, blown up) ──────────────────────────────COMMENT
MEDIUM…yback/src/lib/audio-player/audio-player.component.scss34// ─── Vignette overlay (matches content-hero pattern) ─────────────────────────COMMENT
MEDIUM…yback/src/lib/audio-player/audio-player.component.scss60// ─── Floating content stage ──────────────────────────────────────────────────COMMENT
MEDIUM…yback/src/lib/audio-player/audio-player.component.scss75// ─── Artwork card ────────────────────────────────────────────────────────────COMMENT
MEDIUM…yback/src/lib/audio-player/audio-player.component.scss124// ─── Station name ────────────────────────────────────────────────────────────COMMENT
MEDIUM…yback/src/lib/audio-player/audio-player.component.scss141// ─── Live / Paused badge ─────────────────────────────────────────────────────COMMENT
MEDIUM…yback/src/lib/audio-player/audio-player.component.scss181// ─── Transport controls ──────────────────────────────────────────────────────COMMENT
MEDIUM…yback/src/lib/audio-player/audio-player.component.scss229// ─── Volume row ──────────────────────────────────────────────────────────────COMMENT
MEDIUM…yback/src/lib/audio-player/audio-player.component.scss255// ─── Entrance ────────────────────────────────────────────────────────────────COMMENT
MEDIUM…yback/src/lib/audio-player/audio-player.component.scss276// ─── Responsive ──────────────────────────────────────────────────────────────COMMENT
MEDIUM…i/epg/src/lib/epg-timeline/epg-timeline-render.util.ts3// ───────────────────────── short-programme strategy ─────────────────────────COMMENT
MEDIUM…feature/src/lib/file-upload/file-upload.component.scss6// ─── Dashed drop zone ────────────────────────────────────────────────────────COMMENT
MEDIUM…feature/src/lib/file-upload/file-upload.component.scss108// ─── Selected-file card ─────────────────────────────────────────────────────COMMENT
MEDIUM…add-playlist-dialog/add-playlist-dialog.component.scss20// ─── Dialog head (title + helper subtitle) ──────────────────────────────────COMMENT
MEDIUM…add-playlist-dialog/add-playlist-dialog.component.scss53// ─── Method grid (5 flat cards instead of 2-level segmented control) ────────COMMENT
MEDIUM…add-playlist-dialog/add-playlist-dialog.component.scss181// ─── Form area ──────────────────────────────────────────────────────────────COMMENT
MEDIUM…add-playlist-dialog/add-playlist-dialog.component.scss262// ─── Light-theme segmented control tweak ────────────────────────────────────COMMENT
MEDIUM…e/src/lib/recently-added/recently-added.component.scss35// ── Skeleton rails ─────────────────────────────────────────────────────────COMMENT
MEDIUM…b/live-stream-layout/live-stream-layout.component.scss8// ─── Sidebar-header overrides ──────────────────────────────────────────────COMMENT
MEDIUM…b/live-stream-layout/live-stream-layout.component.scss14// ─── Side-panel channel list ───────────────────────────────────────────────COMMENT
MEDIUM…ature/src/lib/account-info/account-info.component.scss6// ─── Hero header ────────────────────────────────────────────────────────────COMMENT
MEDIUM…ature/src/lib/account-info/account-info.component.scss73// ─── Status pills ───────────────────────────────────────────────────────────COMMENT
MEDIUM…ature/src/lib/account-info/account-info.component.scss109// ─── Messages ───────────────────────────────────────────────────────────────COMMENT
MEDIUM…ature/src/lib/account-info/account-info.component.scss126// ─── Hero stat cards ────────────────────────────────────────────────────────COMMENT
MEDIUM…ature/src/lib/account-info/account-info.component.scss193// ─── Content area ───────────────────────────────────────────────────────────COMMENT
MEDIUM…ature/src/lib/account-info/account-info.component.scss206// ─── Detail panels ──────────────────────────────────────────────────────────COMMENT
MEDIUM…ature/src/lib/account-info/account-info.component.scss241// ─── Detail rows ────────────────────────────────────────────────────────────COMMENT
MEDIUM…ature/src/lib/account-info/account-info.component.scss296// ─── Chip sections ──────────────────────────────────────────────────────────COMMENT
MEDIUM…ature/src/lib/account-info/account-info.component.scss342// ─── Error state ────────────────────────────────────────────────────────────COMMENT
MEDIUM…ature/src/lib/account-info/account-info.component.scss377// ─── Skeleton loading ───────────────────────────────────────────────────────COMMENT
MEDIUM…ature/src/lib/account-info/account-info.component.scss422// ─── Footer actions ─────────────────────────────────────────────────────────COMMENT
MEDIUM…ature/src/lib/account-info/account-info.component.scss443// ─── Responsive breakpoints ─────────────────────────────────────────────────COMMENT
MEDIUM…gory-content-view/category-content-view.component.scss20// ─── Sticky header bar — styled like a widget header ─────────────────────────COMMENT
MEDIUM…gory-content-view/category-content-view.component.scss31// ─── Category meta (title + subtitle) ────────────────────────────────────────COMMENT
MEDIUM…gory-content-view/category-content-view.component.scss52// ─── Refine controls — show current sort/filter state compactly ──────────────COMMENT
MEDIUM…gory-content-view/category-content-view.component.scss168// ─── Paginator — flush right, no ghost background ────────────────────────────COMMENT
MEDIUM…gory-content-view/category-content-view.component.scss240// ─── Grid scroll area ─────────────────────────────────────────────────────────COMMENT
MEDIUMlibs/portal/shared/ui/src/lib/styles/_skeleton.scss1// ─── Shared skeleton / shimmer primitives ────────────────────────────────────COMMENT
MEDIUMlibs/portal/shared/ui/src/lib/styles/_skeleton.scss4// ─── Grid skeleton (poster cards) ────────────────────────────────────────────COMMENT
59 more matches not shown…
Hyper-Verbose Identifiers354 hits · 366 pts
SeverityFileLineSnippetContext
LOWtools/release/capture-v020-screenshots.ts497async function waitForTransientUiToSettle(page: Page): Promise<void> {CODE
LOWtools/release/capture-v020-screenshots.ts637function requireCapturedPlaylistId(CODE
LOW…/lib/season-container/episode-info-dialog.component.ts23export function buildEpisodeInfoDialogData(CODE
LOW…ents/src/lib/season-container/episode-progress.util.ts30export function formatEpisodePositionText(CODE
LOW…ents/src/lib/season-container/episode-download.util.ts70export function buildXtreamEpisodeDownloadRequest(options: {CODE
LOW…c/lib/channel-list-container/channel-list-sort.util.ts8export function isPlaylistChannelSortMode(CODE
LOW…c/lib/channel-list-container/channel-list-sort.util.ts14export function restorePlaylistChannelSortMode(CODE
LOW…c/lib/channel-list-container/channel-list-sort.util.ts22export function persistPlaylistChannelSortMode(CODE
LOW…c/lib/channel-list-container/channel-list-sort.util.ts29export function getPlaylistChannelSortModeLabel(CODE
LOW…/src/lib/channel-list-container/epg-enrichment.util.ts61export function buildChannelEpgMetadataMap(CODE
LOW…lib/playback-diagnostics/playback-media-source.util.ts81export function createPlaybackSourceMetadata(CODE
LOW…lib/playback-diagnostics/playback-media-source.util.ts98export function getPlaybackMediaExtensionFromUrl(url: string): string {CODE
LOW…lib/playback-diagnostics/playback-media-source.util.ts127export function getLikelyBrowserUnsupportedCodecLabels(CODE
LOW…lib/playback-diagnostics/playback-media-source.util.ts169function inferContainerFromMimeType(mimeType: string | undefined): string {CODE
LOW…lib/playback-diagnostics/playback-media-source.util.ts196function getMediaExtensionFromQuery(CODE
LOW…lib/playback-diagnostics/playback-media-source.util.ts217function normalizeDeclaredMediaExtension(value: string | undefined): string {CODE
LOW…/lib/playback-diagnostics/playback-diagnostics.util.ts36export function classifyNativePlaybackIssue(CODE
LOW…/lib/playback-diagnostics/playback-diagnostics.util.ts148export function classifyMpegTsPlaybackIssue(CODE
LOW…/lib/playback-diagnostics/playback-diagnostics.util.ts211export function classifyUnsupportedHlsManifestCodecs(CODE
LOW…/lib/playback-diagnostics/playback-diagnostics.util.ts266function isExternalFallbackRecommended(code: PlaybackDiagnosticCode): boolean {CODE
LOW…lib/portal-inline-player/series-playback-navigation.ts114export function getSeriesPlaybackNavigation(CODE
LOW…/lib/web-player-view/web-player-view.component.spec.ts659function createUnsupportedContainerDiagnostic(): PlaybackDiagnostic {CODE
LOW…/lib/web-player-view/web-player-view.component.spec.ts673function createBrowserAccessDiagnostic(): PlaybackDiagnostic {CODE
LOW…/lib/web-player-view/web-player-view.component.spec.ts688function createUnsupportedCodecDiagnostic(): PlaybackDiagnostic {CODE
LOWlibs/ui/epg/src/lib/epg-program.utils.ts29export function deduplicateProgramsByTimeSlot(CODE
LOWlibs/ui/epg/src/lib/epg-program.utils.ts69function selectMoreInformativeProgram(CODE
LOWlibs/ui/epg/src/lib/epg-timeline/epg-timeline.utils.ts203export function nearestDateKeyWithPrograms(CODE
LOW…/ui/epg/src/lib/epg-list-view/epg-list-view.effects.ts22export function registerEpgListViewEffects(CODE
LOW…red/ui/src/lib/playlist-refresh-action.service.spec.ts46async function waitForRefreshPreparationPaint(): Promise<void> {CODE
LOW…lker/feature/src/lib/stalker-catalog-facade.service.ts319export function provideStalkerCatalogFacade(): Provider[] {CODE
LOW…ure/src/lib/stalker-workspace-route-session.service.ts135export function provideStalkerWorkspaceRouteSession(): Provider[] {CODE
LOW…/lib/stalker-series-view/stalker-series-quick-start.ts37export function getStalkerSeriesQuickStartButton(CODE
LOW…/lib/stalker-series-view/stalker-series-quick-start.ts83function getOrderedVodSeriesSeasons(CODE
LOW…/lib/stalker-series-view/stalker-series-quick-start.ts94function getQuickStartLazyVodSeriesSeason(CODE
LOW…/lib/stalker-series-view/stalker-series-quick-start.ts131function getFirstUnloadedVodSeriesSeason(CODE
LOW…/lib/stalker-series-view/stalker-series-quick-start.ts137function findVodSeriesSeasonIndexForEpisode(CODE
LOW…/lib/stalker-series-view/stalker-series-quick-start.ts157function getLazyVodSeriesEpisodeLabel(CODE
LOW…ortal/stalker/data-access/src/lib/stalker-vod.utils.ts54export function normalizeStalkerSeriesFlag(CODE
LOW…ortal/stalker/data-access/src/lib/stalker-vod.utils.ts73export function buildStalkerFavoritePayload(CODE
LOW…ortal/stalker/data-access/src/lib/stalker-vod.utils.ts110export function normalizeStalkerEntityIdAsNumber(CODE
LOW…ortal/stalker/data-access/src/lib/stalker-vod.utils.ts169export function buildStalkerSelectedVodItem(CODE
LOW…ortal/stalker/data-access/src/lib/stalker-vod.utils.ts195export function normalizeStalkerFavoriteItem(CODE
LOW…ortal/stalker/data-access/src/lib/stalker-vod.utils.ts234export function normalizeStalkerVodDetailsItem(CODE
LOW…ortal/stalker/data-access/src/lib/stalker-vod.utils.ts246export function createStalkerInlineDetailState(CODE
LOW…ortal/stalker/data-access/src/lib/stalker-vod.utils.ts284export function createStalkerDetailViewState(CODE
LOW…ortal/stalker/data-access/src/lib/stalker-vod.utils.ts304export function clearStalkerDetailViewState(): StalkerDetailViewState {CODE
LOW…ortal/stalker/data-access/src/lib/stalker-vod.utils.ts322export function createPortalFavoritesResource(CODE
LOW…ortal/stalker/data-access/src/lib/stalker-vod.utils.ts358export function isSelectedStalkerVodFavorite(CODE
LOW…ker/data-access/src/lib/stalker-live-playback.utils.ts26export function isCrossOriginStalkerStream(CODE
LOW…ker/data-access/src/lib/stalker-live-playback.utils.ts42export function buildStalkerExternalPlaybackHeaders(CODE
LOW…/stalker/data-access/src/lib/stalker-identity.utils.ts16export function getStalkerPortalIdentityFromPlaylist(CODE
LOW…/data-access/src/lib/stores/stalker-tmdb-enrichment.ts29export function stalkerSelectionMediaType(CODE
LOW…/data-access/src/lib/stores/stalker-tmdb-enrichment.ts38export async function enrichStalkerSelectionWithTmdb(CODE
LOW…ss/src/lib/stores/features/with-stalker-epg.feature.ts326function extractEntriesFromBulkValue(value: unknown): StalkerEpgEntry[] {CODE
LOW…ss/src/lib/stores/features/with-stalker-epg.feature.ts443function getProgramTimestampSeconds(CODE
LOW…ss/src/lib/stores/features/with-stalker-epg.feature.ts485function normalizeOptionalEntityId(CODE
LOW…s/src/lib/stores/utils/stalker-player-request.utils.ts33export function normalizeStalkerPlaybackCommand(value: string): string {CODE
LOW…s/src/lib/stores/utils/stalker-player-request.utils.ts55export function resolveStalkerPlaybackUrl(CODE
LOW…b/stores/utils/stalker-collection-persistence.utils.ts26export function getStalkerSeriesRecentMetadata(CODE
LOW…b/stores/utils/stalker-collection-persistence.utils.ts40export function buildStalkerRecentlyViewedPayload(CODE
294 more matches not shown…
Hallucination Indicators1 hit · 10 pts
SeverityFileLineSnippetContext
CRITICAL…end/src/app/events/epg-worker.service.progress.spec.ts187 const statuses = win.webContents.send.mock.calls.map(CODE
Fake / Example Data6 hits · 6 pts
SeverityFileLineSnippetContext
LOW…ponents/src/lib/content-hero/content-hero.component.ts91 const hue = this.calculateHue(this.title() || 'placeholder');CODE
LOW…ponents/src/lib/content-hero/content-hero.component.ts97 const hue = this.calculateHue(this.title() || 'placeholder');CODE
LOW…/lib/components/search-form/search-form.component.html9 [placeholder]="placeholder"CODE
LOW…ashboard/feature/src/lib/rails/dashboard-hero.utils.ts99 const hue = calculateHue(title || 'placeholder');CODE
LOW…src/app/database/operations/operations.test-helpers.ts38 kind: 'placeholder',CODE
LOW…c/app/database/operations/favorites.operations.spec.ts8 kind: 'placeholder',CODE
Over-Commented Block6 hits · 6 pts
SeverityFileLineSnippetContext
LOWapps/electron-backend/native/src/embedded_mpv.mm1#include <napi.h>COMMENT
LOWapps/electron-backend/native/src/embedded_mpv.mm21#include <cstdint>COMMENT
LOW…/electron-backend/native/src/embedded_mpv_wid_common.h1#pragma onceCOMMENT
LOW…/electron-backend/native/src/embedded_mpv_wid_common.h41#define mpv_create pfn_mpv_createCOMMENT
LOW…/electron-backend/native/src/embedded_mpv_wid_common.h61#include <cstdint>COMMENT
LOWapps/web/src/_settings-theme.scss1.settings-container {COMMENT
Verbosity Indicators2 hits · 4 pts
SeverityFileLineSnippetContext
LOW…stalker/data-access/src/lib/stalker-session.service.ts426 // Step 1: Handshake to get token and randomCOMMENT
LOW…stalker/data-access/src/lib/stalker-session.service.ts433 // Step 2: Get profile to activate token and get account infoCOMMENT
Structural Annotation Overuse2 hits · 4 pts
SeverityFileLineSnippetContext
LOW…stalker/data-access/src/lib/stalker-session.service.ts426 // Step 1: Handshake to get token and randomCOMMENT
LOW…stalker/data-access/src/lib/stalker-session.service.ts433 // Step 2: Get profile to activate token and get account infoCOMMENT