Refactor lyric storage so each song owns its sections instead of sharing global labels. Adds song_sections (per song+label) owning song_slides; labels stay global ProPresenter group tags (name/color/macro). Arrangements now reference sections, so editing/importing one song no longer corrupts others that share a label name. - New: song_sections table + migration with safe backfill; SongSection, SongArrangementSection models; SongSectionController (edit/add/delete sections, immediate persistence) wired into SongEditModal. - Refactor writers/readers: CcliImport, ProImport, SongService, ArrangementController, SongController, ProExport, PDF, Translation (translation reset now section-scoped), CCLI pairing. - CCLI import fixes: parse SongSelect copy-icon format (German "Vers" abbrev + trailing author), fill empty CTS-synced songs instead of blocking as duplicate, distinct label colors per section kind, import&edit/existing-song open the edit modal (no 404/405), teleport paste dialog above assign dialog, preview shows section content, correct SongSelect search URL, copy-icon instructions. - Bookmarklet clicks #generalCopyLyricsButton and captures clipboard; serves correct host from request. - Export: embed key-visual/background under fixed bundle-relative names. - Tests updated for the section model; new section + isolation coverage. |
||
|---|---|---|
| .. | ||
| 5-verses.txt | ||
| copy-icon-vers-author-trailing.txt | ||
| english-dutch.txt | ||
| english-french.txt | ||
| english-german-side-by-side.txt | ||
| english-italian.txt | ||
| english-only-multi-verse.txt | ||
| english-only-single-verse.txt | ||
| english-spanish.txt | ||
| german-only.txt | ||
| interlude-misc.txt | ||
| intro-outro.txt | ||
| long-bridge.txt | ||
| missing-copyright.txt | ||
| missing-year.txt | ||
| mixed-german-english-labels.txt | ||
| no-translation.txt | ||
| pre-chorus.txt | ||
| README.md | ||
| repeat-marker.txt | ||
| tag-ending.txt | ||
| umlauts.txt | ||
| verse-letter-suffix.txt | ||
| whitespace-edge-cases.txt | ||
CCLI Fixture Corpus
Synthetic CCLI SongSelect "View Lyrics" page text fixtures for testing the CcliPasteParser.
Anonymization
- Song titles use
Test Song N - Artist names use
Test Artist N - CCLI IDs use
9999XXX - Lyrics are synthetic but keep realistic SongSelect structure
Format
Each fixture follows this structure:
- Song title (first line)
- Artist name
- Blank line
- Section label on its own line
- Lyric lines
- Repeated section blocks as needed
- Footer copyright line starting with
© - Footer
CCLI # NNNNNNN
Coverage
| File | Purpose |
|---|---|
| english-only-multi-verse.txt | Standard EN song with Verse/Chorus/Bridge |
| english-only-single-verse.txt | Minimal song with one verse and one chorus |
| english-german-side-by-side.txt | Alternating EN/DE labels |
| english-french.txt | English labels with French lyrics |
| english-spanish.txt | English labels with Spanish lyrics |
| english-dutch.txt | English labels with Dutch lyrics |
| english-italian.txt | English labels with Italian lyrics |
| german-only.txt | German labels only |
| repeat-marker.txt | Repeat markers like (Repeat) and x2 |
| verse-letter-suffix.txt | Verse suffixes like 2a and 2b |
| mixed-german-english-labels.txt | Mixed EN/DE labels |
| missing-copyright.txt | No copyright line |
| missing-year.txt | © without year |
| whitespace-edge-cases.txt | Leading/trailing spaces and double blanks |
| umlauts.txt | German umlauts and ß |
| long-bridge.txt | Long bridge with internal blank line |
| pre-chorus.txt | Pre-Chorus sections |
| tag-ending.txt | Tag and Ending sections |
| intro-outro.txt | Intro and Outro sections |
| interlude-misc.txt | Interlude and Misc sections |
| no-translation.txt | English-only import case |
| 5-verses.txt | Stress test with five verses |