Overview
The entire application currently lives in one file: src/Qrip.py (~3,700 lines). There are no tests, no separate modules, and no separation of concerns. This makes the code hard to navigate, difficult to test, and intimidating for new contributors.
This is a gradual refactor — do not attempt to split everything at once. Each step below is a self-contained PR.
Suggested extraction order
Each step should be done as a separate PR. After each one, verify the app still runs correctly before moving on.
How to approach each step
- Identify all related functions/methods in
src/Qrip.py
- Move them to the new module file
- Update imports in
Qrip.py
- Run the app manually and verify the affected feature still works
Goal
src/Qrip.py becomes a thin UI layer that wires together focused, independently readable modules — each of which can eventually have its own tests.
Good starting point for new contributors: Step 1 (lyrics module) is the most isolated and well-defined piece. It's a great way to get familiar with the codebase.
Overview
The entire application currently lives in one file:
src/Qrip.py(~3,700 lines). There are no tests, no separate modules, and no separation of concerns. This makes the code hard to navigate, difficult to test, and intimidating for new contributors.This is a gradual refactor — do not attempt to split everything at once. Each step below is a self-contained PR.
Suggested extraction order
Each step should be done as a separate PR. After each one, verify the app still runs correctly before moving on.
src/lyrics.py. This is the most self-contained piece and a good starting point._apply_stored_credentials()and allaccounts.jsonread/write logic intosrc/credentials.py.src/config.py.src/downloader.py.src/services.py(see also Extract service detection logic into a single reusable structure #62).How to approach each step
src/Qrip.pyQrip.pyGoal
src/Qrip.pybecomes a thin UI layer that wires together focused, independently readable modules — each of which can eventually have its own tests.