{"adoption": {"forks": 61, "observed_at": "2026-08-28T04:04:35.998789+00:00", "stars": 1392}, "canonical_url": "https://ross.abutalabs.com/products/universal", "card": {"archived": false, "artifact_type": "plugin", "description": "通用流媒体平台增强及双语字幕解决方案", "domain": ["media"], "enriched": true, "function": ["video-processing", "nlp", "middleware", "proxy"], "health_score": 95, "homepage": "https://DualSubs.github.io/guide/universal", "language": "JavaScript", "license": "Apache-2.0", "license_family": "permissive", "maturity": "active", "member_repos": ["DualSubs/Universal"], "name": "DualSubs/Universal", "platform": ["cross-platform"], "pushed_at": "2026-08-20T14:21:23+00:00", "repo": "DualSubs/Universal", "stars": 1392, "tags": ["dual-subtitles", "webvtt", "streaming-services", "surge", "loon", "boxjs", "subtitle-translation", "mitm-proxy-script", "video", "localization", "streaming", "automation", "ios", "macos", "javascript"], "topics": ["webvtt-subtitles", "streaming-services", "dual-subtitles", "streaming", "subtitles", "video"], "urls": [], "use_cases": ["watch Netflix or Disney+ with dual-language subtitles", "translate streaming subtitles into Chinese automatically", "add bilingual subtitle options to HLS streaming players", "load external SRT or WebVTT subtitles into streaming apps", "fix subtitle timing offsets on streaming platforms", "merge official and translated subtitle tracks in one player"], "what_it_is": "DualSubs: Universal is a proxy-script-based solution that adds bilingual and translated subtitle options to HLS streaming platforms (e.g., Disney+, HBO Max, Spotify) via Surge, Loon, or BoxJs configurations. It intercepts WebVTT subtitle streams, merges official tracks, translates them via Google/DeepL/Microsoft translators, and supports external subtitle files with timestamp correction.", "when_to_avoid": ["you need YouTube or Netflix support specifically - those require separate DualSubs modules", "you cannot or do not want to run a MitM proxy tool", "you need a standalone desktop subtitle editor rather than an in-player enhancement"], "when_to_choose": ["you use Surge, Loon, or BoxJs and want bilingual subtitles on streaming platforms", "you need configurable primary/secondary languages and multiple translation engines", "you want official plus translated subtitle options inside the native player"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/universal", "repo": "DualSubs/Universal", "role": "main", "score": 84}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:35.998789+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:39:31.014703+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c92875e8b94474b64920af0f85d36b30a84901cc2606af9ed4885741c5306316", "fetched_at": "2026-08-28T04:04:35.998789+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DualSubs/Universal"}, {"content_hash": "e7d987060cf5c1d409400a39dfabe9ee6935b85c094d23987420798f16f43265", "fetched_at": "2026-08-29T11:54:40.054073+00:00", "kind": "homepage", "missing": false, "url": "https://DualSubs.github.io/guide/universal"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:35.998789+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:39:31.014703+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c92875e8b94474b64920af0f85d36b30a84901cc2606af9ed4885741c5306316", "fetched_at": "2026-08-28T04:04:35.998789+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DualSubs/Universal"}, {"content_hash": "e7d987060cf5c1d409400a39dfabe9ee6935b85c094d23987420798f16f43265", "fetched_at": "2026-08-29T11:54:40.054073+00:00", "kind": "homepage", "missing": false, "url": "https://DualSubs.github.io/guide/universal"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:39:31.014703+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c92875e8b94474b64920af0f85d36b30a84901cc2606af9ed4885741c5306316", "fetched_at": "2026-08-28T04:04:35.998789+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DualSubs/Universal"}, {"content_hash": "e7d987060cf5c1d409400a39dfabe9ee6935b85c094d23987420798f16f43265", "fetched_at": "2026-08-29T11:54:40.054073+00:00", "kind": "homepage", "missing": false, "url": "https://DualSubs.github.io/guide/universal"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:04:35.998789+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:35.998789+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:35.998789+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:39:31.014703+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c92875e8b94474b64920af0f85d36b30a84901cc2606af9ed4885741c5306316", "fetched_at": "2026-08-28T04:04:35.998789+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DualSubs/Universal"}, {"content_hash": "e7d987060cf5c1d409400a39dfabe9ee6935b85c094d23987420798f16f43265", "fetched_at": "2026-08-29T11:54:40.054073+00:00", "kind": "homepage", "missing": false, "url": "https://DualSubs.github.io/guide/universal"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:35.998789+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:35.998789+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:39:31.014703+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c92875e8b94474b64920af0f85d36b30a84901cc2606af9ed4885741c5306316", "fetched_at": "2026-08-28T04:04:35.998789+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DualSubs/Universal"}, {"content_hash": "e7d987060cf5c1d409400a39dfabe9ee6935b85c094d23987420798f16f43265", "fetched_at": "2026-08-29T11:54:40.054073+00:00", "kind": "homepage", "missing": false, "url": "https://DualSubs.github.io/guide/universal"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:35.998789+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:35.998789+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:35.998789+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:39:31.014703+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c92875e8b94474b64920af0f85d36b30a84901cc2606af9ed4885741c5306316", "fetched_at": "2026-08-28T04:04:35.998789+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DualSubs/Universal"}, {"content_hash": "e7d987060cf5c1d409400a39dfabe9ee6935b85c094d23987420798f16f43265", "fetched_at": "2026-08-29T11:54:40.054073+00:00", "kind": "homepage", "missing": false, "url": "https://DualSubs.github.io/guide/universal"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:35.998789+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:35.998789+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:39:31.014703+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c92875e8b94474b64920af0f85d36b30a84901cc2606af9ed4885741c5306316", "fetched_at": "2026-08-28T04:04:35.998789+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DualSubs/Universal"}, {"content_hash": "e7d987060cf5c1d409400a39dfabe9ee6935b85c094d23987420798f16f43265", "fetched_at": "2026-08-29T11:54:40.054073+00:00", "kind": "homepage", "missing": false, "url": "https://DualSubs.github.io/guide/universal"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:39:31.014703+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c92875e8b94474b64920af0f85d36b30a84901cc2606af9ed4885741c5306316", "fetched_at": "2026-08-28T04:04:35.998789+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DualSubs/Universal"}, {"content_hash": "e7d987060cf5c1d409400a39dfabe9ee6935b85c094d23987420798f16f43265", "fetched_at": "2026-08-29T11:54:40.054073+00:00", "kind": "homepage", "missing": false, "url": "https://DualSubs.github.io/guide/universal"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:39:31.014703+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c92875e8b94474b64920af0f85d36b30a84901cc2606af9ed4885741c5306316", "fetched_at": "2026-08-28T04:04:35.998789+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DualSubs/Universal"}, {"content_hash": "e7d987060cf5c1d409400a39dfabe9ee6935b85c094d23987420798f16f43265", "fetched_at": "2026-08-29T11:54:40.054073+00:00", "kind": "homepage", "missing": false, "url": "https://DualSubs.github.io/guide/universal"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:39:31.014703+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c92875e8b94474b64920af0f85d36b30a84901cc2606af9ed4885741c5306316", "fetched_at": "2026-08-28T04:04:35.998789+00:00", "kind": "readme", "missing": false, "url": "https://github.com/DualSubs/Universal"}, {"content_hash": "e7d987060cf5c1d409400a39dfabe9ee6935b85c094d23987420798f16f43265", "fetched_at": "2026-08-29T11:54:40.054073+00:00", "kind": "homepage", "missing": false, "url": "https://DualSubs.github.io/guide/universal"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 98, "longevity": 100, "rhythm": 58}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 1647, "days_push": 13, "days_rel": 283, "gap_med": 4, "n_releases_24m": 20}, "score": 84, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}