Re-organized providers and added a few

This commit is contained in:
Connor Johnstone
2026-03-20 14:52:16 -04:00
parent fed86c9e85
commit eaaff5f98f
12 changed files with 353 additions and 185 deletions

View File

@@ -265,6 +265,56 @@ pub fn settings_page() -> Html {
html! {}
};
let lastfm_key_html = {
let key_set = ytauth.as_ref().map(|s| s.lastfm_api_key_set).unwrap_or(false);
if key_set {
html! {
<p class="text-sm" style="margin: 0.25rem 0 0 0;">
<span style="color: var(--success);">{ "\u{2713}" }</span>
{ " API key configured via " }
<code>{ "SHANTY_LASTFM_API_KEY" }</code>
</p>
}
} else {
html! {
<p class="text-sm" style="margin: 0.25rem 0 0 0; color: var(--warning);">
{ "Set " }
<code>{ "SHANTY_LASTFM_API_KEY" }</code>
{ " environment variable. Get a key at " }
<a href="https://www.last.fm/api/account/create" target="_blank">{ "last.fm/api/account/create" }</a>
{ " (use any name, leave callback URL blank)." }
</p>
}
}
};
let fanart_key_html = {
let key_set = ytauth
.as_ref()
.map(|s| s.fanart_api_key_set)
.unwrap_or(false);
if key_set {
html! {
<p class="text-sm" style="margin: 0.25rem 0 0 0;">
<span style="color: var(--success);">{ "\u{2713}" }</span>
{ " API key configured via " }
<code>{ "SHANTY_FANART_API_KEY" }</code>
{ ". Provides artist thumbnails and HD banners." }
</p>
}
} else {
html! {
<p class="text-sm" style="margin: 0.25rem 0 0 0; color: var(--warning);">
{ "Set " }
<code>{ "SHANTY_FANART_API_KEY" }</code>
{ " environment variable. Get a key at " }
<a href="https://fanart.tv/get-an-api-key/" target="_blank">{ "fanart.tv" }</a>
{ "." }
</p>
}
}
};
html! {
<div>
<div class="page-header">
@@ -441,6 +491,82 @@ pub fn settings_page() -> Html {
{ ytauth_html }
</div>
// Metadata Providers
<div class="card">
<h3>{ "Metadata Providers" }</h3>
<div class="form-group">
<label>{ "Music Database" }</label>
<select onchange={let config = config.clone(); Callback::from(move |e: Event| {
let select: HtmlSelectElement = e.target_unchecked_into();
let mut cfg = (*config).clone().unwrap();
cfg.metadata.metadata_source = select.value();
config.set(Some(cfg));
})}>
{ for [("musicbrainz", "MusicBrainz")].iter().map(|(v, label)| html! {
<option value={*v} selected={c.metadata.metadata_source == *v}>{ label }</option>
})}
</select>
</div>
<div class="form-group">
<label>{ "Artist Images" }</label>
<select onchange={let config = config.clone(); Callback::from(move |e: Event| {
let select: HtmlSelectElement = e.target_unchecked_into();
let mut cfg = (*config).clone().unwrap();
cfg.metadata.artist_image_source = select.value();
config.set(Some(cfg));
})}>
{ for [("wikipedia", "Wikipedia"), ("fanarttv", "fanart.tv")].iter().map(|(v, label)| html! {
<option value={*v} selected={c.metadata.artist_image_source == *v}>{ label }</option>
})}
</select>
</div>
if c.metadata.artist_image_source == "fanarttv" {
{ fanart_key_html.clone() }
}
<div class="form-group">
<label>{ "Artist Bios" }</label>
<select onchange={let config = config.clone(); Callback::from(move |e: Event| {
let select: HtmlSelectElement = e.target_unchecked_into();
let mut cfg = (*config).clone().unwrap();
cfg.metadata.artist_bio_source = select.value();
config.set(Some(cfg));
})}>
{ for [("wikipedia", "Wikipedia"), ("lastfm", "Last.fm")].iter().map(|(v, label)| html! {
<option value={*v} selected={c.metadata.artist_bio_source == *v}>{ label }</option>
})}
</select>
</div>
if c.metadata.artist_bio_source == "lastfm" {
{ lastfm_key_html.clone() }
}
<div class="form-group">
<label>{ "Lyrics" }</label>
<select onchange={let config = config.clone(); Callback::from(move |e: Event| {
let select: HtmlSelectElement = e.target_unchecked_into();
let mut cfg = (*config).clone().unwrap();
cfg.metadata.lyrics_source = select.value();
config.set(Some(cfg));
})}>
{ for [("lrclib", "LRCLIB")].iter().map(|(v, label)| html! {
<option value={*v} selected={c.metadata.lyrics_source == *v}>{ label }</option>
})}
</select>
</div>
<div class="form-group">
<label>{ "Cover Art" }</label>
<select onchange={let config = config.clone(); Callback::from(move |e: Event| {
let select: HtmlSelectElement = e.target_unchecked_into();
let mut cfg = (*config).clone().unwrap();
cfg.metadata.cover_art_source = select.value();
config.set(Some(cfg));
})}>
{ for [("coverartarchive", "Cover Art Archive")].iter().map(|(v, label)| html! {
<option value={*v} selected={c.metadata.cover_art_source == *v}>{ label }</option>
})}
</select>
</div>
</div>
// Indexing
<div class="card">
<h3>{ "Indexing" }</h3>