with begin?"}
C --> |Yes| D["Collect children with begin/end"]
D --> E["Merge spans into words
respect trailing spaces"]
E --> F["Build ParsedLine with words"]
C --> |No| G["Return empty"]
F --> H["toLRC(): format [mm:ss.xx]
and optional
extract lines, timestamps,
merge rich sync metadata"]
```
**Diagram sources**
- [TTMLParser.kt:32-185](file://media-source/src/main/java/com/suvojeet/suvmusic/providers/lyrics/TTMLParser.kt#L32-L185)
- [LyricsUtils.kt:12-75](file://app/src/main/java/com/suvojeet/suvmusic/util/LyricsUtils.kt#L12-L75)
**Section sources**
- [TTMLParser.kt:11-214](file://media-source/src/main/java/com/suvojeet/suvmusic/providers/lyrics/TTMLParser.kt#L11-L214)
- [LyricsUtils.kt:6-76](file://app/src/main/java/com/suvojeet/suvmusic/util/LyricsUtils.kt#L6-L76)
- [LyricsRepository.kt:303-305](file://app/src/main/java/com/suvojeet/suvmusic/data/repository/LyricsRepository.kt#L303-L305)
### UI Rendering and Animation
- LyricsScreen displays lyrics with customizable alignment, font size, line spacing, and animation type (line or word)
- Supports sync offset adjustment for timing correction
- Provides controls for play/pause, seek, and provider switching
- Uses DynamicLyricsBackground and Compose animations for immersive experience
```mermaid
sequenceDiagram
participant VM as "ViewModel"
participant UI as "LyricsScreen"
participant Repo as "LyricsRepository"
participant Util as "LyricsUtils"
VM->>UI : lyrics, isFetching, currentTime
UI->>UI : compute effectiveTime = currentTime + syncOffset
UI->>Util : parseLyrics(lines) for rendering
Util-->>UI : sorted Lines with words (if rich sync)
UI->>UI : animate highlight based on animationType
UI-->>VM : onSeekTo adjusted for syncOffset
```
**Diagram sources**
- [LyricsScreen.kt:344-361](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/LyricsScreen.kt#L344-L361)
- [LyricsUtils.kt:12-55](file://app/src/main/java/com/suvojeet/suvmusic/util/LyricsUtils.kt#L12-L55)
**Section sources**
- [LyricsScreen.kt:77-106](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/LyricsScreen.kt#L77-L106)
- [LyricsScreen.kt:344-361](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/LyricsScreen.kt#L344-L361)
### Export Functionality
- LyricsImageGenerator: creates a shareable PNG with background artwork, lyrics, and song info
- LyricsPdfGenerator: generates a multi-page PDF with styled header/footer and pagination
```mermaid
flowchart TD
StartImg["generateAndShareImage(context, lines, title, artist, artwork)"] --> BG["drawBackground()"]
BG --> LYR["drawLyrics()"]
LYR --> FOOT["drawFooter()"]
FOOT --> SAVE["saveToCache()"]
StartPdf["generateAndSharePdf(context, lines, title, artist)"] --> DOC["PdfDocument()"]
DOC --> HEADER["Draw header with title/artist/branding"]
HEADER --> CONTENT["Layout and paginate content"]
CONTENT --> FOOTER["Draw footer and page numbers"]
FOOTER --> SAVEPDF["savePdfToDocuments()"]
```
**Diagram sources**
- [LyricsImageGenerator.kt:30-59](file://app/src/main/java/com/suvojeet/suvmusic/ui/utils/LyricsImageGenerator.kt#L30-L59)
- [LyricsImageGenerator.kt:61-109](file://app/src/main/java/com/suvojeet/suvmusic/ui/utils/LyricsImageGenerator.kt#L61-L109)
- [LyricsImageGenerator.kt:111-153](file://app/src/main/java/com/suvojeet/suvmusic/ui/utils/LyricsImageGenerator.kt#L111-L153)
- [LyricsImageGenerator.kt:155-196](file://app/src/main/java/com/suvojeet/suvmusic/ui/utils/LyricsImageGenerator.kt#L155-L196)
- [LyricsImageGenerator.kt:198-219](file://app/src/main/java/com/suvojeet/suvmusic/ui/utils/LyricsImageGenerator.kt#L198-L219)
- [LyricsPdfGenerator.kt:24-190](file://app/src/main/java/com/suvojeet/suvmusic/util/LyricsPdfGenerator.kt#L24-L190)
- [LyricsPdfGenerator.kt:192-218](file://app/src/main/java/com/suvojeet/suvmusic/util/LyricsPdfGenerator.kt#L192-L218)
**Section sources**
- [LyricsImageGenerator.kt:24-221](file://app/src/main/java/com/suvojeet/suvmusic/ui/utils/LyricsImageGenerator.kt#L24-L221)
- [LyricsPdfGenerator.kt:18-220](file://app/src/main/java/com/suvojeet/suvmusic/util/LyricsPdfGenerator.kt#L18-L220)
### Provider Settings and Customization
- LyricsProvidersScreen manages enabling/disabling providers and selecting preferred provider
- LyricsScreen exposes customization for text position, animation type, font size, line spacing, and sync offset
**Section sources**
- [LyricsProvidersScreen.kt:52-145](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/LyricsProvidersScreen.kt#L52-L145)
- [LyricsScreen.kt:498-791](file://app/src/main/java/com/suvojeet/suvmusic/ui/screens/LyricsScreen.kt#L498-L791)
## Dependency Analysis
- Repository depends on:
- SessionManager for provider enablement and preference
- External repositories for source lyrics (YouTube/JioSaavn)
- OkHttp client for network calls (LRCLIB)
- Provider implementations for fetching lyrics
- Providers depend on:
- External APIs or local filesystem
- UI depends on:
- Repository for lyrics data
- Utilities for parsing and export
```mermaid
graph LR
UI["LyricsScreen"] --> Repo["LyricsRepository"]
Repo --> BL["BetterLyricsProvider"]
Repo --> SM["SimpMusicLyricsProvider"]
Repo --> KG["KuGouLyricsProvider"]
Repo --> LRCL["LrcLibLyricsProvider"]
Repo --> LOC["LocalLyricsProvider"]
Repo --> OK["OkHttpClient"]
BL --> TML["TTMLParser"]
Repo --> TU["LyricsUtils"]
UI --> IMG["LyricsImageGenerator"]
UI --> PDF["LyricsPdfGenerator"]
```
**Diagram sources**
- [LyricsRepository.kt:27-38](file://app/src/main/java/com/suvojeet/suvmusic/data/repository/LyricsRepository.kt#L27-L38)
- [BetterLyricsProvider.kt:9-31](file://media-source/src/main/java/com/suvojeet/suvmusic/providers/lyrics/BetterLyricsProvider.kt#L9-L31)
- [SimpMusicLyricsProvider.kt:10-32](file://lyric-simpmusic/src/main/java/com/suvojeet/suvmusic/simpmusic/SimpMusicLyricsProvider.kt#L10-L32)
- [KuGouLyricsProvider.kt:10-34](file://lyric-kugou/src/main/java/com/suvojeet/suvmusic/kugou/KuGouLyricsProvider.kt#L10-L34)
- [LrcLibLyricsProvider.kt:13-15](file://lyric-lrclib/src/main/java/com/suvojeet/suvmusic/lrclib/LrcLibLyricsProvider.kt#L13-L15)
- [LocalLyricsProvider.kt:14-16](file://app/src/main/java/com/suvojeet/suvmusic/providers/lyrics/LocalLyricsProvider.kt#L14-L16)
- [TTMLParser.kt:11-214](file://media-source/src/main/java/com/suvojeet/suvmusic/providers/lyrics/TTMLParser.kt#L11-L214)
- [LyricsUtils.kt:6-76](file://app/src/main/java/com/suvojeet/suvmusic/util/LyricsUtils.kt#L6-L76)
- [LyricsImageGenerator.kt:24-221](file://app/src/main/java/com/suvojeet/suvmusic/ui/utils/LyricsImageGenerator.kt#L24-L221)
- [LyricsPdfGenerator.kt:18-220](file://app/src/main/java/com/suvojeet/suvmusic/util/LyricsPdfGenerator.kt#L18-L220)
**Section sources**
- [LyricsRepository.kt:27-38](file://app/src/main/java/com/suvojeet/suvmusic/data/repository/LyricsRepository.kt#L27-L38)
- [LrcLibLyricsProvider.kt:13-179](file://lyric-lrclib/src/main/java/com/suvojeet/suvmusic/lrclib/LrcLibLyricsProvider.kt#L13-L179)
## Performance Considerations
- Caching: LruCache with bounded size prevents repeated network calls; cache keys include provider type to avoid cross-provider collisions
- Provider ordering: preferred provider first reduces latency for successful matches
- Parsing: LyricsUtils and TTMLParser operate on strings; complexity proportional to number of lines and words
- UI rendering: lazy lists and animated transitions optimized for smooth playback; keepScreenOn toggle minimizes UI interruptions
- Network: LRCLIB search uses similarity scoring and duration penalties; consider retry/backoff for transient failures
[No sources needed since this section provides general guidance]
## Troubleshooting Guide
Common issues and resolutions:
- No lyrics found:
- Verify provider enablement in settings
- Check preferred provider selection
- Confirm song metadata (title, artist, duration) accuracy
- Incorrect timing:
- Use sync offset adjustment in lyrics screen
- Prefer synced providers (BetterLyrics, LRCLIB)
- Poor matches:
- Enable multiple providers; repository tries fallbacks automatically
- Use LRCLIB search fallback logic
- Local lyrics not detected:
- Ensure .lrc/.txt sidecar files or embedded tags exist
- Verify storage permissions and file paths
**Section sources**
- [LyricsRepository.kt:51-184](file://app/src/main/java/com/suvojeet/suvmusic/data/repository/LyricsRepository.kt#L51-L184)
- [LocalLyricsProvider.kt:19-62](file://app/src/main/java/com/suvojeet/suvmusic/providers/lyrics/LocalLyricsProvider.kt#L19-L62)
- [LrcLibLyricsProvider.kt:65-130](file://lyric-lrclib/src/main/java/com/suvojeet/suvmusic/lrclib/LrcLibLyricsProvider.kt#L65-L130)
## Conclusion
SuvMusic’s lyrics system provides robust, extensible support for multiple providers with intelligent fallback, caching, and synchronization. The architecture cleanly separates concerns between data retrieval, parsing, and presentation, enabling reliable real-time lyric display and flexible customization. Export capabilities further enhance user engagement by allowing sharing and archival of lyrics experiences.
[No sources needed since this section summarizes without analyzing specific files]
## Appendices
### Model Definitions
- Lyrics: container for lines, source credit, sync flag, and provider type
- LyricsLine: text with optional timestamps and word-level timing
- LyricsWord: individual word with precise timing
**Section sources**
- [Lyrics.kt:3-34](file://core/model/src/main/java/com/suvojeet/suvmusic/core/model/Lyrics.kt#L3-L34)
- [Lyrics.kt:3-34](file://media-source/src/main/java/com/suvojeet/suvmusic/providers/lyrics/Lyrics.kt#L3-L34)