feat(lyrics): expand sources and display controls

This commit is contained in:
h465855hgg
2026-07-18 18:29:33 +08:00
parent 1e23c02e0b
commit fc3d3447d0
10 changed files with 1682 additions and 230 deletions
+331 -2
View File
@@ -1,10 +1,10 @@
id = "h465855hgg/lyrics"
name = "Lyrics"
version = "1.3.0"
version = "1.4.0"
plugin_api = 3
author = "h465855hgg"
license = "MIT"
dependencies = ["playerctl", "python3", "cp"]
dependencies = ["playerctl", "python3", "cp", "chmod"]
tags = ["bar", "service", "music", "media", "animation"]
icon = "music"
description = "Synchronized lyrics with karaoke highlighting, animated transitions, and flexible lyric sources."
@@ -35,11 +35,112 @@ options = [
{ value = "auto", label_key = "settings.lyrics_source.options.auto" },
{ value = "lrclib", label_key = "settings.lyrics_source.options.lrclib" },
{ value = "netease", label_key = "settings.lyrics_source.options.netease" },
{ value = "qqmusic", label_key = "settings.lyrics_source.options.qqmusic" },
{ value = "kugou", label_key = "settings.lyrics_source.options.kugou" },
{ value = "qishui", label_key = "settings.lyrics_source.options.qishui" },
{ value = "apple_music", label_key = "settings.lyrics_source.options.apple_music" },
{ value = "spotify", label_key = "settings.lyrics_source.options.spotify" },
{ value = "musixmatch", label_key = "settings.lyrics_source.options.musixmatch" },
{ value = "mpris", label_key = "settings.lyrics_source.options.mpris" },
{ value = "custom", label_key = "settings.lyrics_source.options.custom" },
{ value = "external", label_key = "settings.lyrics_source.options.external" },
]
[[setting]]
key = "lyrics_sources"
type = "string_list"
label_key = "settings.lyrics_sources.label"
description_key = "settings.lyrics_sources.description"
default = ["lrclib", "netease", "qqmusic", "kugou", "qishui", "apple_music", "spotify", "musixmatch"]
visible_when = { key = "lyrics_source", values = ["auto"] }
advanced = true
[[setting]]
key = "translation_language"
type = "select"
label_key = "settings.translation_language.label"
description_key = "settings.translation_language.description"
default = "zh-Hans"
options = [
{ value = "zh-Hans", label_key = "settings.translation_language.options.zh-Hans" },
{ value = "zh-Hant", label_key = "settings.translation_language.options.zh-Hant" },
{ value = "en", label_key = "settings.translation_language.options.en" },
{ value = "ja", label_key = "settings.translation_language.options.ja" },
{ value = "ko", label_key = "settings.translation_language.options.ko" },
]
[[setting]]
key = "spotify_sp_dc"
type = "string"
label_key = "settings.spotify_sp_dc.label"
description_key = "settings.spotify_sp_dc.description"
default = ""
advanced = true
visible_when = { key = "lyrics_source", values = ["spotify"] }
[[setting]]
key = "spotify_access_token"
type = "string"
label_key = "settings.spotify_access_token.label"
description_key = "settings.spotify_access_token.description"
default = ""
advanced = true
visible_when = { key = "lyrics_source", values = ["spotify"] }
[[setting]]
key = "apple_developer_token"
type = "string"
label_key = "settings.apple_developer_token.label"
description_key = "settings.apple_developer_token.description"
default = ""
advanced = true
visible_when = { key = "lyrics_source", values = ["apple_music"] }
[[setting]]
key = "apple_user_token"
type = "string"
label_key = "settings.apple_user_token.label"
description_key = "settings.apple_user_token.description"
default = ""
advanced = true
visible_when = { key = "lyrics_source", values = ["apple_music"] }
[[setting]]
key = "apple_storefront"
type = "string"
label_key = "settings.apple_storefront.label"
description_key = "settings.apple_storefront.description"
default = "us"
advanced = true
visible_when = { key = "lyrics_source", values = ["apple_music"] }
[[setting]]
key = "musixmatch_token"
type = "string"
label_key = "settings.musixmatch_token.label"
description_key = "settings.musixmatch_token.description"
default = ""
advanced = true
visible_when = { key = "lyrics_source", values = ["musixmatch"] }
[[setting]]
key = "qishui_api_url"
type = "string"
label_key = "settings.qishui_api_url.label"
description_key = "settings.qishui_api_url.description"
default = ""
advanced = true
visible_when = { key = "lyrics_source", values = ["qishui"] }
[[setting]]
key = "qishui_token"
type = "string"
label_key = "settings.qishui_token.label"
description_key = "settings.qishui_token.description"
default = ""
advanced = true
visible_when = { key = "lyrics_source", values = ["qishui"] }
[[setting]]
key = "custom_url"
type = "string"
@@ -55,6 +156,7 @@ label_key = "settings.custom_json_field.label"
description_key = "settings.custom_json_field.description"
default = "syncedLyrics"
visible_when = { key = "lyrics_source", values = ["custom"] }
advanced = true
[[setting]]
key = "cue_text"
@@ -69,6 +171,7 @@ type = "select"
label_key = "settings.cue_font_mode.label"
description_key = "settings.cue_font_mode.description"
default = "follow"
advanced = true
options = [
{ value = "follow", label_key = "settings.cue_font_mode.options.follow" },
{ value = "custom", label_key = "settings.cue_font_mode.options.custom" },
@@ -81,6 +184,101 @@ label_key = "settings.cue_font_family.label"
description_key = "settings.cue_font_family.description"
default = "sans-serif"
visible_when = { key = "cue_font_mode", values = ["custom"] }
advanced = true
[[setting]]
key = "lyrics_offset_ms"
type = "int"
label_key = "settings.lyrics_offset_ms.label"
description_key = "settings.lyrics_offset_ms.description"
default = 0
min = -10000
max = 10000
[[setting]]
key = "poll_interval_ms"
type = "int"
label_key = "settings.poll_interval_ms.label"
description_key = "settings.poll_interval_ms.description"
default = 500
min = 100
max = 5000
advanced = true
[[setting]]
key = "display_mode"
type = "select"
label_key = "settings.display_mode.label"
description_key = "settings.display_mode.description"
default = "toggle"
options = [
{ value = "toggle", label_key = "settings.display_mode.options.toggle" },
{ value = "lyrics", label_key = "settings.display_mode.options.lyrics" },
{ value = "track", label_key = "settings.display_mode.options.track" },
]
[[setting]]
key = "double_line"
type = "bool"
label_key = "settings.double_line.label"
description_key = "settings.double_line.description"
default = true
[[setting]]
key = "double_line_auto_fit"
type = "bool"
label_key = "settings.double_line_auto_fit.label"
description_key = "settings.double_line_auto_fit.description"
default = true
visible_when = { key = "double_line", values = ["true"] }
[[setting]]
key = "double_line_height_budget"
type = "int"
label_key = "settings.double_line_height_budget.label"
description_key = "settings.double_line_height_budget.description"
default = 26
min = 18
max = 40
visible_when = { key = "double_line", values = ["true"] }
advanced = true
[[setting]]
key = "show_translation"
type = "bool"
label_key = "settings.show_translation.label"
description_key = "settings.show_translation.description"
default = true
visible_when = { key = "double_line", values = ["true"] }
[[setting]]
key = "show_romanization"
type = "bool"
label_key = "settings.show_romanization.label"
description_key = "settings.show_romanization.description"
default = false
visible_when = { key = "double_line", values = ["true"] }
[[setting]]
key = "secondary_line_mode"
type = "select"
label_key = "settings.secondary_line_mode.label"
description_key = "settings.secondary_line_mode.description"
default = "translation_first"
options = [
{ value = "translation_first", label_key = "settings.secondary_line_mode.options.translation_first" },
{ value = "romanization_first", label_key = "settings.secondary_line_mode.options.romanization_first" },
{ value = "translation", label_key = "settings.secondary_line_mode.options.translation" },
{ value = "romanization", label_key = "settings.secondary_line_mode.options.romanization" },
]
visible_when = { key = "double_line", values = ["true"] }
[[setting]]
key = "karaoke_enabled"
type = "bool"
label_key = "settings.karaoke_enabled.label"
description_key = "settings.karaoke_enabled.description"
default = true
[[setting]]
key = "scroll_mode"
@@ -102,6 +300,7 @@ default = 30
min = 10
max = 120
description_key = "settings.marquee_speed.description"
advanced = true
[[setting]]
key = "max_lines"
@@ -111,6 +310,7 @@ default = 1
min = 1
max = 3
description_key = "settings.max_lines.description"
advanced = true
[[setting]]
key = "gradient"
@@ -130,6 +330,9 @@ options = [
{ value = "cascade", label_key = "settings.animation.options.cascade" },
{ value = "wave", label_key = "settings.animation.options.wave" },
{ value = "fade", label_key = "settings.animation.options.fade" },
{ value = "typewriter", label_key = "settings.animation.options.typewriter" },
{ value = "pulse", label_key = "settings.animation.options.pulse" },
{ value = "blink", label_key = "settings.animation.options.blink" },
{ value = "none", label_key = "settings.animation.options.none" },
]
@@ -141,6 +344,7 @@ default = 15
min = 8
max = 80
description_key = "settings.max_chars.description"
advanced = true
[[setting]]
key = "char_width"
@@ -150,6 +354,92 @@ default = 9
min = 4
max = 24
description_key = "settings.char_width.description"
advanced = true
[[setting]]
key = "font_family"
type = "string"
label_key = "settings.font_family.label"
description_key = "settings.font_family.description"
default = ""
[[setting]]
key = "primary_font_size"
type = "int"
label_key = "settings.primary_font_size.label"
description_key = "settings.primary_font_size.description"
default = 0
min = 0
max = 48
[[setting]]
key = "font_weight"
type = "select"
label_key = "settings.font_weight.label"
description_key = "settings.font_weight.description"
default = "normal"
options = [
{ value = "thin", label_key = "settings.font_weight.options.thin" },
{ value = "light", label_key = "settings.font_weight.options.light" },
{ value = "normal", label_key = "settings.font_weight.options.normal" },
{ value = "medium", label_key = "settings.font_weight.options.medium" },
{ value = "semibold", label_key = "settings.font_weight.options.semibold" },
{ value = "bold", label_key = "settings.font_weight.options.bold" },
{ value = "heavy", label_key = "settings.font_weight.options.heavy" },
]
[[setting]]
key = "secondary_font_size"
type = "int"
label_key = "settings.secondary_font_size.label"
description_key = "settings.secondary_font_size.description"
default = 10
min = 6
max = 36
visible_when = { key = "double_line", values = ["true"] }
[[setting]]
key = "font_style"
type = "select"
label_key = "settings.font_style.label"
description_key = "settings.font_style.description"
default = "normal"
advanced = true
options = [
{ value = "normal", label_key = "settings.font_style.options.normal" },
{ value = "fixed", label_key = "settings.font_style.options.fixed" },
{ value = "ink_centered", label_key = "settings.font_style.options.ink_centered" },
]
[[setting]]
key = "line_gap"
type = "int"
label_key = "settings.line_gap.label"
description_key = "settings.line_gap.description"
default = 2
min = 0
max = 24
visible_when = { key = "double_line", values = ["true"] }
[[setting]]
key = "padding_left"
type = "int"
label_key = "settings.padding_left.label"
description_key = "settings.padding_left.description"
default = 0
min = 0
max = 64
advanced = true
[[setting]]
key = "padding_right"
type = "int"
label_key = "settings.padding_right.label"
description_key = "settings.padding_right.description"
default = 0
min = 0
max = 64
advanced = true
# Headless background service: polls MPRIS metadata, fetches lyrics, publishes state.
[[service]]
@@ -186,6 +476,38 @@ entry = "lyrics.luau"
description_key = "settings.show_cover.description"
default = true
[[widget.setting]]
key = "cover_shape"
type = "select"
label_key = "settings.cover_shape.label"
description_key = "settings.cover_shape.description"
default = "circle"
options = [
{ value = "circle", label_key = "settings.cover_shape.options.circle" },
{ value = "rounded", label_key = "settings.cover_shape.options.rounded" },
{ value = "square", label_key = "settings.cover_shape.options.square" },
{ value = "custom", label_key = "settings.cover_shape.options.custom" },
]
[[widget.setting]]
key = "cover_radius"
type = "int"
label_key = "settings.cover_radius.label"
description_key = "settings.cover_radius.description"
default = 5
min = 0
max = 32
visible_when = { key = "cover_shape", values = ["custom"] }
[[widget.setting]]
key = "cover_size"
type = "int"
label_key = "settings.cover_size.label"
description_key = "settings.cover_size.description"
default = 18
min = 12
max = 32
[[widget.setting]]
key = "active_color"
type = "color"
@@ -199,3 +521,10 @@ entry = "lyrics.luau"
label_key = "settings.inactive_color.label"
description_key = "settings.inactive_color.description"
default = "on_surface_variant"
[[widget.setting]]
key = "secondary_color"
type = "color"
label_key = "settings.secondary_color.label"
description_key = "settings.secondary_color.description"
default = "on_surface_variant"