mirror of
https://github.com/KRTirtho/spotube.git
synced 2026-02-04 07:52:55 +00:00
6.2 KiB
6.2 KiB
Lyrics Plugin System Migration
This document explains the migration from built-in lyrics to a plugin-based system.
What Changed
Before
- Lyrics providers were built into the main application
- Hard-coded implementations for each service
- Required app updates to add new providers
After
- Lyrics are provided through plugins
- Community can create providers for any service
- No app updates needed for new providers
- Follows the same pattern as audio source plugins
Architecture
┌─────────────────────────────────────────┐
│ Spotube Main App │
│ │
│ ┌───────────────────────────────────┐ │
│ │ Lyrics Plugin Interface │ │
│ │ (MetadataPluginLyricsEndpoint) │ │
│ └───────────────────────────────────┘ │
│ ↓ │
│ ┌───────────────────────────────────┐ │
│ │ Hetu Script Engine │ │
│ └───────────────────────────────────┘ │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ Lyrics Plugin (.smplug) │
│ │
│ - plugin.json (metadata) │
│ - plugin.out (compiled Hetu bytecode) │
│ - logo.png (optional) │
│ │
│ Implements: │
│ - search(params) → List<Lyrics> │
│ - getById(id) → Lyrics? │
│ - isAvailable() → bool │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ External Lyrics API │
│ (LrcLib, Musixmatch, Genius, etc.) │
└─────────────────────────────────────────┘
Main App Changes
Added Files
lib/services/metadata/endpoints/lyrics.dart- Lyrics endpoint interfacelib/provider/lyrics_plugin_provider.dart- Riverpod providers for lyricslib/services/lyrics_provider/README.md- DocumentationLYRICS_PLUGIN_GUIDE.md- Plugin development guideLYRICS_PLUGIN_TEMPLATE.md- Template repository structureLYRICS_PLUGIN_MIGRATION.md- This file
Modified Files
lib/models/metadata/plugin.dart- AddedlyricstoPluginAbilitiesenumlib/services/metadata/metadata.dart- Added lyrics endpoint initialization
Removed Files
- All built-in lyrics provider implementations (moved to plugins)
Plugin Development
Quick Start
- Clone template:
LYRICS_PLUGIN_TEMPLATE.md - Implement Hetu script in
src/main.ht - Compile:
hetu compile src/main.ht -o plugin.out - Package:
zip plugin.smplug plugin.json plugin.out logo.png - Publish on GitHub with releases
Required Methods
class LyricsEndpoint {
external fun search(Map params) async
external fun getById(String id) async
external fun isAvailable() async
}
Data Format
Input (search params):
{
'trackName': String,
'artistName': String,
'albumName': String?,
'duration': int? // seconds
}
Output (lyrics):
{
'uri': String,
'name': String,
'lyrics': [
{
'time': int, // milliseconds
'text': String
}
],
'rating': int,
'provider': String
}
Usage in Main App
Get Lyrics Plugin
final plugin = ref.watch(lyricsPluginProvider);
Search Lyrics
final lyrics = await ref.read(lyricsSearchProvider({
'trackName': 'Song Name',
'artistName': 'Artist Name',
'albumName': 'Album Name',
'duration': Duration(seconds: 180),
}).future);
Get by ID
final lyric = await ref.read(lyricsByIdProvider('lrclib:12345').future);
Plugin Examples
LrcLib Plugin
- Free, open-source
- No API key required
- Repository: Create at
spotube-plugin-lrclib-lyrics
Musixmatch Plugin
- Commercial service
- Requires API key
- Repository: Create at
spotube-plugin-musixmatch-lyrics
Genius Plugin
- Community lyrics
- Web scraping or API
- Repository: Create at
spotube-plugin-genius-lyrics
Benefits
- Extensibility: Anyone can add new lyrics sources
- Maintainability: Plugins maintained separately
- Flexibility: Users choose their preferred provider
- Privacy: No forced third-party services
- Community: Encourages community contributions
- Updates: Plugins update independently
Migration Path for Users
- Update Spotube to version with plugin support
- Install lyrics plugin from Settings > Plugins
- Choose default lyrics provider
- Existing lyrics cache remains compatible
For Plugin Developers
Resources
- Plugin Guide:
LYRICS_PLUGIN_GUIDE.md - Template:
LYRICS_PLUGIN_TEMPLATE.md - Example: Check
assets/plugins/spotube-plugin-youtube-audio/ - Hetu Docs: https://hetu.dev
Testing
- Compile plugin locally
- Load in Spotube via file path
- Test search and getById methods
- Verify time-sync accuracy
- Test error handling
Publishing
- Create GitHub repository
- Add GitHub Actions for auto-build
- Create release with
.smplugfile - Users install via repo URL
Support
- Discord: https://discord.gg/spotube
- GitHub: https://github.com/KRTirtho/spotube
- Docs: https://spotube.krtirtho.dev
Future Enhancements
- Multiple provider fallback
- Provider priority settings
- Lyrics caching system
- Offline lyrics support
- User-contributed lyrics
- Lyrics translation plugins
- Karaoke mode plugins