RepoPilotOpen in app →

jitwxs/163MusicLyrics

云音乐歌词获取处理工具【网易云、QQ音乐】

Mixed

Single-maintainer risk — review before adopting

worst of 4 axes
Use as dependencyMixed

no tests detected; no CI workflows detected

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • Last commit 8w ago
  • 2 active contributors
  • Apache-2.0 licensed
Show 4 more →
  • Small team — 2 contributors active in recent commits
  • Single-maintainer risk — top contributor 89% of recent commits
  • No CI workflows detected
  • No test directory detected
What would change the summary?
  • Use as dependency MixedHealthy if: add a test suite

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Forkable" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/jitwxs/163musiclyrics?axis=fork)](https://repopilot.app/r/jitwxs/163musiclyrics)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/jitwxs/163musiclyrics on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: jitwxs/163MusicLyrics

Generated by RepoPilot · 2026-05-10 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/jitwxs/163MusicLyrics shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

WAIT — Single-maintainer risk — review before adopting

  • Last commit 8w ago
  • 2 active contributors
  • Apache-2.0 licensed
  • ⚠ Small team — 2 contributors active in recent commits
  • ⚠ Single-maintainer risk — top contributor 89% of recent commits
  • ⚠ No CI workflows detected
  • ⚠ No test directory detected

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live jitwxs/163MusicLyrics repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/jitwxs/163MusicLyrics.

What it runs against: a local clone of jitwxs/163MusicLyrics — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in jitwxs/163MusicLyrics | Confirms the artifact applies here, not a fork | | 2 | License is still Apache-2.0 | Catches relicense before you depend on it | | 3 | Default branch master exists | Catches branch renames | | 4 | Last commit ≤ 87 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>jitwxs/163MusicLyrics</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of jitwxs/163MusicLyrics. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/jitwxs/163MusicLyrics.git
#   cd 163MusicLyrics
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of jitwxs/163MusicLyrics and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "jitwxs/163MusicLyrics(\\.git)?\\b" \\
  && ok "origin remote is jitwxs/163MusicLyrics" \\
  || miss "origin remote is not jitwxs/163MusicLyrics (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
  && ok "license is Apache-2.0" \\
  || miss "license drift — was Apache-2.0 at generation time"

# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
  && ok "default branch master exists" \\
  || miss "default branch master no longer exists"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 87 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~57d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/jitwxs/163MusicLyrics"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

A Windows Forms desktop application (C#) that fetches, parses, and manages song lyrics from NetEase Cloud Music and QQ Music APIs. It supports batch lyric retrieval by song ID/URL, album, or playlist; includes format conversion (LRC ↔ SRT), optional machine translation (Baidu/CaiYun), cover image downloads, preview playback, and local caching—eliminating manual lyric searching across multiple music platforms. Single WinForm application (archive-winform/MusicLyricApp/) organized by functional layers: Api/ (NetEaseMusicApi.cs, QQMusicApi.cs with caching wrappers), Bean/ (data models like NetEaseMusicBean.cs, MusicLyricsVO.cs), and UI (MainForm.cs, MusicLyricForm.cs). Translation services (BaiduTranslateApi.cs, CaiYunTranslateApi.cs) are decoupled via ITranslateApi interface; GlobalCache.cs centralizes caching.

👥Who it's for

Chinese music enthusiasts and developers who need to programmatically extract lyrics from NetEase/QQ Music; users wanting a standalone desktop tool to build personal lyric libraries with translation support; contributors maintaining or extending music metadata scrapers.

🌱Maturity & risk

Moderately mature with active maintenance: ~773KB C# codebase, released versions tracked on GitHub Releases, wiki documentation exists for users. However, the archived WinForms structure suggests the main codebase may have transitioned away from this UI framework. No CI/CD pipeline visible (.github/workflows absent), test files not evident in file listing.

Single-maintainer project (jitwxs) with dependency on external music APIs (NetEase, QQ) that can break without notice; no visible test suite increases regression risk when APIs change. WinForms is a legacy Windows-only UI framework with limited cross-platform appeal. NLog and Fody dependencies add build complexity; last commit recency unknown from provided metadata.

Active areas of work

Project tracks issues and feature requests via GitHub Issues template (-----bug-report.md, -----feature-suggest.md) and maintains a public Projects board. Active areas likely include API endpoint maintenance (music providers change frequently), lyric format robustness, and translation integrations—but specific recent commits/PRs not visible in provided metadata.

🚀Get running

Check README for instructions.

Daily commands:

  1. Load archive-winform/163MusicLyrics.sln in Visual Studio. 2. Restore NuGet packages (Fody, NLog). 3. Build solution (Ctrl+Shift+B). 4. Run MusicLyricApp.exe from bin\Debug or bin\Release. GUI launches; input song ID/URL/keyword and select NetEase or QQ Music provider to fetch lyrics.

🗺️Map of the codebase

🛠️How to make changes

New music provider: implement IMusicApi in Api/Music/ (mimic NetEaseMusicApi.cs), register in MainForm.cs provider dropdown. New translator: implement ITranslateApi in Api/Translate/ (reference BaiduTranslateApi.cs), wire into UI. New lyrics format: extend CsvBean.cs or MusicLyricsVO.cs, add conversion logic alongside LRC↔SRT in core parsing. UI changes: edit MainForm.Designer.cs (visual) and MainForm.cs (logic).

🪤Traps & gotchas

No visible .env or config management: API keys for Baidu/CaiYun translation likely embedded or require manual App.config edit (archive-winform/MusicLyricApp/App.config)—check there for placeholder credentials. NetEase/QQ Music API fragility: These endpoints are reverse-engineered and undocumented; updates to either platform's auth/signature scheme will break NetEaseMusicNativeApi.cs or QQMusicNativeApi.cs without warning. WinForms thread safety: UI updates from async API calls must marshal back to UI thread—look for Invoke() calls in MainForm.cs; missing marshaling causes crashes. No unit tests visible: changes to Api/ layer have no automated safety net; manual testing required. Fody weaving: Build may fail if FodyWeavers.xml references missing packages—check NuGet restore output.

💡Concepts to learn

  • Reverse-engineered API — NetEaseMusicApi.cs and QQMusicApi.cs are not official APIs—they decode undocumented endpoints by observing web client traffic. Understanding how to inject headers, sign requests, and parse proprietary responses is critical to maintaining this project when platform updates occur.
  • Strategy Pattern — IMusicApi and ITranslateApi interfaces let you swap implementations (NetEase vs QQ, Baidu vs CaiYun) without changing MainForm.cs; essential pattern for supporting multiple providers.
  • Decorator Pattern — MusicCacheableApi and TranslateCacheableApi wrap base API instances to add caching transparently; lets you cache results without modifying NetEaseMusicApi.cs itself.
  • LRC (Lyrics) Format — Core output format for synchronized lyrics; this project converts between LRC and SRT (subtitle format). Understanding LRC timestamp syntax ([mm:ss.xx]) and tag format ([ti:song name]) is necessary to debug parsing or add format extensions.
  • IL Weaving (Fody) — FodyWeavers.xml in the build pipeline modifies compiled C# bytecode post-compilation (e.g., injecting logging, property getters). Build failures or runtime surprises often trace back to Fody configuration mismatches.
  • Thread Marshaling (WinForms) — Async API calls (network I/O) must safely update UI controls; WinForms requires Control.Invoke() to cross thread boundaries. Violations cause 'InvalidOperationException' or UI hangs.
  • HTTP Request Signing / Cryptographic Hashing — NetEase and QQ Music likely require signed requests (HMAC-SHA256 or MD5) to prevent scraping. NetEaseMusicNativeApi.cs and QQMusicNativeApi.cs contain these signatures; they break when platform changes the algorithm.
  • UnblockNeteaseMusic/server — Also reverse-engineers NetEase Music API; shares similar endpoint discovery and signature challenges; useful reference for API auth patterns when they drift.
  • Binaryify/NeteaseCloudMusicApi — Node.js reverse-engineered NetEase Music API wrapper with active maintenance; if this C# project's NetEase endpoints break, that repo's solutions may apply.
  • kyubotics/qqmusic-api — QQ Music API wrapper; complements this project's QQMusicApi.cs implementation; useful for cross-checking endpoint signatures.
  • lostpupil/musicbox — Terminal-based NetEase Music client; different UI (curses) but overlaps on API parsing logic; shows alternative architecture for same data sources.
  • soimort/you-get — Multi-platform media downloader with music metadata extraction; broader ecosystem showing how lyrics/covers/playback fit into media management pipelines.

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add unit tests for music API implementations (NetEaseMusicApi, QQMusicApi)

The repo has multiple API implementations (NetEaseMusicApi.cs, QQMusicApi.cs, their NativeApi variants) but no visible test directory. These are critical components for lyrics fetching. Adding unit tests would catch API breaking changes early, improve code reliability, and provide examples for contributors on how the API layer works.

  • [ ] Create a new test project 'MusicLyricApp.Tests' in archive-winform/
  • [ ] Add unit tests for NetEaseMusicNativeApi.cs covering song/album/playlist search methods
  • [ ] Add unit tests for QQMusicNativeApi.cs covering the same search scenarios
  • [ ] Add integration tests or mock tests for MusicCacheableApi.cs to verify caching behavior
  • [ ] Set up NUnit or xUnit test runner configuration in the .csproj

Extract and document the lyrics parsing logic from LyricUtils.cs with specific test cases

LyricUtils.cs appears to contain critical lyrics processing logic but lacks visible documentation or test coverage. This utility is foundational to the project's core functionality (lyrics retrieval and transformation). Adding comprehensive tests and documentation would clarify edge cases (e.g., lyric format parsing, timestamp handling) and reduce bugs.

  • [ ] Review LyricUtils.cs to identify all public methods and their responsibilities
  • [ ] Create unit tests for each method in LyricUtils covering: normal cases, empty inputs, malformed lyric timestamps, and special characters
  • [ ] Add XML documentation comments to public methods in LyricUtils.cs explaining parameters and return values
  • [ ] Create a specific guide in the wiki for contributors on the lyric format specifications the tool supports

Add GitHub Actions CI workflow for building and testing the WinForms application

The repo has an .github/ISSUE_TEMPLATE folder but no visible CI/CD workflows (.github/workflows/). For a C# WinForms project with multiple API integrations, automated builds on PR ensure code quality and prevent regressions. This is especially important given the archive-winform/ structure suggests this is the active codebase.

  • [ ] Create .github/workflows/build.yml for Windows builds on push and PR events
  • [ ] Configure the workflow to restore NuGet packages and build archive-winform/163MusicLyrics.sln
  • [ ] Add a step to run unit tests (from PR #1) with test result reporting
  • [ ] Configure the workflow to generate build artifacts (.exe or installer) on successful builds
  • [ ] Add status badge to README.md linking to the workflow

🌿Good first issues

  • Add unit tests for NetEaseMusicApi.cs and QQMusicApi.cs (currently untestable): create Tests/ folder with mocked HTTP responses, verify lyric parsing and error handling. Tests would catch API response format regressions early.
  • Document API key setup for Baidu/CaiYun translation**: currently no README or in-code comments explain how to obtain API credentials or configure them in App.config; add inline docs to BaiduTranslateApi.cs and a new SETUP.md file.
  • Extract lyric format conversion logic (LRC ↔ SRT) into a separate reusable class**: currently likely buried in MainForm.cs or MusicLyricsVO.cs; move to Util/LyricFormatConverter.cs so it can be used in a CLI tool or other interfaces.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 26d8a73 — Merge pull request #311 from jitwxs/release/7_3 (jitwxs)
  • fbcf73a — rollback media (jitwxs)
  • a373c9e — Merge pull request #310 from jitwxs/release/7_3 (jitwxs)
  • e72344f — disable media in macos / linux (jitwxs)
  • 1d1df36 — replace media plugin (jitwxs)
  • f0e3560 — update (jitwxs)
  • 352a6ff — update (jitwxs)
  • 604f9f4 — update readme.md (jitwxs)
  • e18e7a6 — #309 add network proxy (jitwxs)
  • 6da9253 — #308 fix xml issue (jitwxs)

🔒Security observations

  • High · Hardcoded Certificate Key File — archive-winform/MusicLyricApp/GetLrc_TemporaryKey.pfx. The file 'GetLrc_TemporaryKey.pfx' appears to be a hardcoded certificate/key file in the repository. This is a sensitive cryptographic material that should never be committed to version control, even if marked as temporary. If this is an actual signing certificate, it poses a significant security risk. Fix: Remove this file from the repository immediately and rotate any credentials if it was used in production. Add *.pfx and *.key files to .gitignore. Use proper secret management systems for certificate handling.
  • High · Potential API Key Exposure in Configuration — archive-winform/MusicLyricApp/Utils/HttpUtils.cs, archive-winform/MusicLyricApp/App.config, various Api classes. The codebase contains multiple API integrations (NetEase Cloud Music, QQ Music, Baidu Translate, CaiYun Translate) through HttpUtils and API classes. There is a risk that API keys or credentials could be hardcoded in configuration files, App.config, or passed unsafely in HTTP requests. Fix: Ensure all API keys and credentials are stored in secure configuration management systems, not in code or config files. Use environment variables or secure vaults. Never log sensitive data. Implement proper credential rotation policies.
  • High · Unvalidated External API Calls — archive-winform/MusicLyricApp/Api/Music/, archive-winform/MusicLyricApp/Api/Translate/. Multiple music and translation APIs are called (NetEase, QQ Music, Baidu, CaiYun). Without visible input validation or output sanitization, there are risks of: SSRF attacks, XXE injection via XML responses, and XSS if responses are rendered without proper encoding. Fix: Implement strict input validation for all user-provided search parameters. Sanitize and validate all API responses before processing. Use secure XML parsing with XXE protections disabled. Implement response size limits and timeouts.
  • Medium · Potential Insecure Deserialization — archive-winform/MusicLyricApp/Utils/JsonUtils.cs, archive-winform/MusicLyricApp/Utils/XmlUtils.cs. The codebase uses JSON deserialization (JsonUtils) and XML parsing (XmlUtils) for API responses and data processing. Without proper type validation and security measures, this could lead to deserialization attacks or XXE vulnerabilities. Fix: Use safe deserialization practices with type whitelisting. For JSON, use strongly-typed deserialization. For XML, disable external entities and DTD processing. Validate all deserialized data.
  • Medium · Insufficient Input Validation on File Operations — archive-winform/MusicLyricApp/Utils/GlobalUtils.cs, cache operations. The codebase supports batch import via directory scanning and file operations. Path traversal vulnerabilities could occur if user input or API responses containing file paths are not properly validated. Fix: Implement strict path validation using canonicalization. Use Path.GetFullPath() and verify the resolved path is within expected directories. Reject paths with suspicious patterns like '../' or absolute paths outside permitted directories.
  • Medium · Missing Dependency Management Visibility — archive-winform/MusicLyricApp/packages.config. The packages.config file content was not provided in the analysis. There is a risk of using outdated or vulnerable NuGet packages without proper dependency auditing and management. Fix: Regularly audit NuGet dependencies using tools like NuGet Analyzer, OWASP Dependency-Check, or Snyk. Keep all dependencies updated. Remove unused dependencies. Document and justify any legacy dependencies.
  • Medium · Potential Information Disclosure via Logging — archive-winform/MusicLyricApp/NLog.config. NLog is configured (NLog.config present), which may log sensitive information such as API responses, user queries, or authentication tokens if not carefully configured. Fix: Review NLog configuration to ensure sensitive data is never logged. Implement data masking for PII and credentials. Set appropriate logging levels (avoid DEBUG/TRACE in production). Store logs securely with restricted access.
  • Low · undefined — undefined. undefined Fix: undefined

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Mixed signals · jitwxs/163MusicLyrics — RepoPilot