feat: Full CLI and TUI support for adding an artist to Lidarr

This commit is contained in:
2026-01-08 15:16:01 -07:00
parent e94f78dc7b
commit c624d1b9e4
28 changed files with 3448 additions and 86 deletions
+269 -3
View File
@@ -2,18 +2,22 @@ use std::sync::atomic::Ordering;
use ratatui::Frame;
use ratatui::layout::{Constraint, Layout, Rect};
use ratatui::widgets::{Cell, Row};
use ratatui::widgets::{Cell, ListItem, Row};
use crate::App;
use crate::models::Route;
use crate::models::lidarr_models::AddArtistSearchResult;
use crate::models::servarr_data::lidarr::lidarr_data::{ADD_ARTIST_BLOCKS, ActiveLidarrBlock};
use crate::models::servarr_data::lidarr::modals::AddArtistModal;
use crate::render_selectable_input_box;
use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::{get_width_from_percentage, layout_block, title_block_centered};
use crate::ui::widgets::button::Button;
use crate::ui::widgets::input_box::InputBox;
use crate::ui::widgets::managarr_table::ManagarrTable;
use crate::ui::widgets::message::Message;
use crate::ui::widgets::popup::{Popup, Size};
use crate::ui::widgets::selectable_list::SelectableList;
use crate::ui::{DrawUi, draw_popup};
#[cfg(test)]
@@ -31,7 +35,28 @@ impl DrawUi for AddArtistUi {
}
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) {
draw_popup(f, app, draw_add_artist_search, Size::Large);
if let Route::Lidarr(active_lidarr_block, _) = app.get_current_route() {
draw_popup(f, app, draw_add_artist_search, Size::Large);
match active_lidarr_block {
ActiveLidarrBlock::AddArtistPrompt
| ActiveLidarrBlock::AddArtistSelectMonitor
| ActiveLidarrBlock::AddArtistSelectMonitorNewItems
| ActiveLidarrBlock::AddArtistSelectQualityProfile
| ActiveLidarrBlock::AddArtistSelectMetadataProfile
| ActiveLidarrBlock::AddArtistSelectRootFolder
| ActiveLidarrBlock::AddArtistTagsInput => {
draw_popup(f, app, draw_confirmation_popup, Size::Long);
}
ActiveLidarrBlock::AddArtistAlreadyInLibrary => {
f.render_widget(
Popup::new(Message::new("This artist is already in your library")).size(Size::Message),
f.area(),
);
}
_ => (),
}
}
}
}
@@ -119,7 +144,15 @@ fn draw_add_artist_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
f.render_widget(layout_block().default_color(), results_area);
f.render_widget(error_message_popup, f.area());
}
ActiveLidarrBlock::AddArtistSearchResults => {
ActiveLidarrBlock::AddArtistSearchResults
| ActiveLidarrBlock::AddArtistPrompt
| ActiveLidarrBlock::AddArtistSelectMonitor
| ActiveLidarrBlock::AddArtistSelectMonitorNewItems
| ActiveLidarrBlock::AddArtistSelectQualityProfile
| ActiveLidarrBlock::AddArtistSelectMetadataProfile
| ActiveLidarrBlock::AddArtistSelectRootFolder
| ActiveLidarrBlock::AddArtistAlreadyInLibrary
| ActiveLidarrBlock::AddArtistTagsInput => {
let search_results_table = ManagarrTable::new(
app.data.lidarr_data.add_searched_artists.as_mut(),
search_results_row_mapping,
@@ -149,3 +182,236 @@ fn draw_add_artist_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
search_box_area,
);
}
fn draw_confirmation_popup(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
if let Route::Lidarr(active_lidarr_block, _) = app.get_current_route() {
match active_lidarr_block {
ActiveLidarrBlock::AddArtistSelectMonitor => {
draw_confirmation_prompt(f, app, area);
draw_add_artist_select_monitor_popup(f, app);
}
ActiveLidarrBlock::AddArtistSelectMonitorNewItems => {
draw_confirmation_prompt(f, app, area);
draw_add_artist_select_monitor_new_items_popup(f, app);
}
ActiveLidarrBlock::AddArtistSelectQualityProfile => {
draw_confirmation_prompt(f, app, area);
draw_add_artist_select_quality_profile_popup(f, app);
}
ActiveLidarrBlock::AddArtistSelectMetadataProfile => {
draw_confirmation_prompt(f, app, area);
draw_add_artist_select_metadata_profile_popup(f, app);
}
ActiveLidarrBlock::AddArtistSelectRootFolder => {
draw_confirmation_prompt(f, app, area);
draw_add_artist_select_root_folder_popup(f, app);
}
ActiveLidarrBlock::AddArtistPrompt | ActiveLidarrBlock::AddArtistTagsInput => {
draw_confirmation_prompt(f, app, area)
}
_ => (),
}
}
}
fn draw_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
let searched_artist = app
.data
.lidarr_data
.add_searched_artists
.as_ref()
.expect("add_searched_artists must be populated")
.current_selection();
let artist_name = &searched_artist.artist_name.text;
let artist_disambiguation = searched_artist.disambiguation.clone().unwrap_or_default();
let title = if artist_disambiguation.is_empty() {
format!("Add - {artist_name}")
} else {
format!("Add - {artist_name} ({artist_disambiguation})")
};
let yes_no_value = app.data.lidarr_data.prompt_confirm;
let selected_block = app.data.lidarr_data.selected_block.get_active_block();
let highlight_yes_no = selected_block == ActiveLidarrBlock::AddArtistConfirmPrompt;
let AddArtistModal {
monitor_list,
monitor_new_items_list,
quality_profile_list,
metadata_profile_list,
root_folder_list,
tags,
..
} = app
.data
.lidarr_data
.add_artist_modal
.as_ref()
.expect("add_artist_modal must exist in this context");
let selected_monitor = monitor_list.current_selection();
let selected_monitor_new_items = monitor_new_items_list.current_selection();
let selected_quality_profile = quality_profile_list.current_selection();
let selected_metadata_profile = metadata_profile_list.current_selection();
let selected_root_folder = root_folder_list.current_selection();
f.render_widget(title_block_centered(&title), area);
let [
_,
root_folder_area,
monitor_area,
monitor_new_items_area,
quality_profile_area,
metadata_profile_area,
tags_area,
_,
buttons_area,
] = Layout::vertical([
Constraint::Fill(1),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Fill(1),
Constraint::Length(3),
])
.margin(1)
.areas(area);
let [add_area, cancel_area] =
Layout::horizontal([Constraint::Percentage(50), Constraint::Percentage(50)])
.areas(buttons_area);
let root_folder_drop_down_button = Button::default()
.title(&selected_root_folder.path)
.label("Root Folder")
.icon("")
.selected(selected_block == ActiveLidarrBlock::AddArtistSelectRootFolder);
let monitor_drop_down_button = Button::default()
.title(selected_monitor.to_display_str())
.label("Monitor")
.icon("")
.selected(selected_block == ActiveLidarrBlock::AddArtistSelectMonitor);
let monitor_new_items_drop_down_button = Button::default()
.title(selected_monitor_new_items.to_display_str())
.label("Monitor New Items")
.icon("")
.selected(selected_block == ActiveLidarrBlock::AddArtistSelectMonitorNewItems);
let quality_profile_drop_down_button = Button::default()
.title(selected_quality_profile)
.label("Quality Profile")
.icon("")
.selected(selected_block == ActiveLidarrBlock::AddArtistSelectQualityProfile);
let metadata_profile_drop_down_button = Button::default()
.title(selected_metadata_profile)
.label("Metadata Profile")
.icon("")
.selected(selected_block == ActiveLidarrBlock::AddArtistSelectMetadataProfile);
f.render_widget(root_folder_drop_down_button, root_folder_area);
f.render_widget(monitor_drop_down_button, monitor_area);
f.render_widget(monitor_new_items_drop_down_button, monitor_new_items_area);
f.render_widget(quality_profile_drop_down_button, quality_profile_area);
f.render_widget(metadata_profile_drop_down_button, metadata_profile_area);
if let Route::Lidarr(active_lidarr_block, _) = app.get_current_route() {
let tags_input_box = InputBox::new(&tags.text)
.offset(tags.offset.load(Ordering::SeqCst))
.label("Tags")
.highlighted(selected_block == ActiveLidarrBlock::AddArtistTagsInput)
.selected(active_lidarr_block == ActiveLidarrBlock::AddArtistTagsInput);
render_selectable_input_box!(tags_input_box, f, tags_area);
}
let add_button = Button::default()
.title("Add")
.selected(yes_no_value && highlight_yes_no);
let cancel_button = Button::default()
.title("Cancel")
.selected(!yes_no_value && highlight_yes_no);
f.render_widget(add_button, add_area);
f.render_widget(cancel_button, cancel_area);
}
fn draw_add_artist_select_monitor_popup(f: &mut Frame<'_>, app: &mut App<'_>) {
let monitor_list = SelectableList::new(
&mut app
.data
.lidarr_data
.add_artist_modal
.as_mut()
.expect("add_artist_modal must exist in this context")
.monitor_list,
|monitor| ListItem::new(monitor.to_display_str().to_owned()),
);
let popup = Popup::new(monitor_list).size(Size::Dropdown);
f.render_widget(popup, f.area());
}
fn draw_add_artist_select_monitor_new_items_popup(f: &mut Frame<'_>, app: &mut App<'_>) {
let monitor_new_items_list = SelectableList::new(
&mut app
.data
.lidarr_data
.add_artist_modal
.as_mut()
.expect("add_artist_modal must exist in this context")
.monitor_new_items_list,
|monitor_new_items| ListItem::new(monitor_new_items.to_display_str().to_owned()),
);
let popup = Popup::new(monitor_new_items_list).size(Size::Dropdown);
f.render_widget(popup, f.area());
}
fn draw_add_artist_select_quality_profile_popup(f: &mut Frame<'_>, app: &mut App<'_>) {
let quality_profile_list = SelectableList::new(
&mut app
.data
.lidarr_data
.add_artist_modal
.as_mut()
.expect("add_artist_modal must exist in this context")
.quality_profile_list,
|quality_profile| ListItem::new(quality_profile.clone()),
);
let popup = Popup::new(quality_profile_list).size(Size::Dropdown);
f.render_widget(popup, f.area());
}
fn draw_add_artist_select_metadata_profile_popup(f: &mut Frame<'_>, app: &mut App<'_>) {
let metadata_profile_list = SelectableList::new(
&mut app
.data
.lidarr_data
.add_artist_modal
.as_mut()
.expect("add_artist_modal must exist in this context")
.metadata_profile_list,
|metadata_profile| ListItem::new(metadata_profile.clone()),
);
let popup = Popup::new(metadata_profile_list).size(Size::Dropdown);
f.render_widget(popup, f.area());
}
fn draw_add_artist_select_root_folder_popup(f: &mut Frame<'_>, app: &mut App<'_>) {
let root_folder_list = SelectableList::new(
&mut app
.data
.lidarr_data
.add_artist_modal
.as_mut()
.expect("add_artist_modal must exist in this context")
.root_folder_list,
|root_folder| ListItem::new(root_folder.path.to_owned()),
);
let popup = Popup::new(root_folder_list).size(Size::Dropdown);
f.render_widget(popup, f.area());
}
@@ -20,7 +20,8 @@ mod tests {
mod snapshot_tests {
use super::*;
use crate::app::App;
use crate::models::HorizontallyScrollableText;
use crate::models::servarr_data::lidarr::lidarr_data::ADD_ARTIST_SELECTION_BLOCKS;
use crate::models::{BlockSelectionState, HorizontallyScrollableText};
use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app};
use rstest::rstest;
@@ -57,5 +58,67 @@ mod tests {
insta::assert_snapshot!(format!("add_artist_ui_{active_lidarr_block}"), output);
}
#[rstest]
#[case(ActiveLidarrBlock::AddArtistPrompt)]
#[case(ActiveLidarrBlock::AddArtistConfirmPrompt)]
#[case(ActiveLidarrBlock::AddArtistSelectMonitor)]
#[case(ActiveLidarrBlock::AddArtistSelectMonitorNewItems)]
#[case(ActiveLidarrBlock::AddArtistSelectQualityProfile)]
#[case(ActiveLidarrBlock::AddArtistSelectMetadataProfile)]
#[case(ActiveLidarrBlock::AddArtistSelectRootFolder)]
#[case(ActiveLidarrBlock::AddArtistTagsInput)]
fn test_add_artist_modal_ui_renders(#[case] active_lidarr_block: ActiveLidarrBlock) {
use crate::models::lidarr_models::{MonitorType, NewItemMonitorType};
use crate::models::servarr_data::lidarr::modals::AddArtistModal;
use crate::models::servarr_models::RootFolder;
use strum::IntoEnumIterator;
let mut app = App::test_default_fully_populated();
app.push_navigation_stack(active_lidarr_block.into());
app.data.lidarr_data.selected_block = BlockSelectionState::new(ADD_ARTIST_SELECTION_BLOCKS);
let mut add_artist_modal = AddArtistModal {
tags: "test".into(),
..AddArtistModal::default()
};
add_artist_modal
.monitor_list
.set_items(Vec::from_iter(MonitorType::iter()));
add_artist_modal
.monitor_new_items_list
.set_items(Vec::from_iter(NewItemMonitorType::iter()));
add_artist_modal
.quality_profile_list
.set_items(vec!["Any".to_owned()]);
add_artist_modal
.metadata_profile_list
.set_items(vec!["Standard".to_owned()]);
add_artist_modal
.root_folder_list
.set_items(vec![RootFolder {
path: "/nfs/music".to_owned(),
..RootFolder::default()
}]);
app.data.lidarr_data.add_artist_modal = Some(add_artist_modal);
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
AddArtistUi::draw(f, app, f.area());
});
insta::assert_snapshot!(format!("add_artist_modal_{active_lidarr_block}"), output);
}
#[test]
fn test_add_artist_already_in_library_ui_renders() {
let mut app = App::test_default_fully_populated();
app.push_navigation_stack(ActiveLidarrBlock::AddArtistAlreadyInLibrary.into());
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
AddArtistUi::draw(f, app, f.area());
});
insta::assert_snapshot!(output);
}
}
}
@@ -0,0 +1,47 @@
---
source: src/ui/lidarr_ui/library/add_artist_ui_tests.rs
expression: output
---
╭───────────────────────────────────────────────────── Add Artist ─────────────────────────────────────────────────────╮
│Test Artist │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ✔ Name Type Status Rating Genres │
│=> Test Artist Person Continuing 8.4 soundtrack │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ ╭─────────────── Error ───────────────╮ │
│ │This artist is already in your library │ │
│ │ │ │
│ ╰───────────────────────────────────────╯ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,14 @@
---
source: src/ui/lidarr_ui/library/add_artist_ui_tests.rs
expression: output
---
╭───────────────────────────────────────────────────── Add Artist ─────────────────────────────────────────────────────╮
│Test Artist │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/library/add_artist_ui_tests.rs
expression: output
---
╭──────────────────────────────── Add - Test Artist (American pianist) ─────────────────────────────────╮
╭──────│ │───────╮
│Test A│ │ │
╰──────│ │───────╯
╭──────│ │───────╮
│ ✔ │ │ │
│=> │ │ │
│ │ │ │
│ │ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Root Folder: │/nfs/music ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Monitor: │All Albums ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Monitor New Items: │All Albums ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Quality Profile: │Any ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Metadata Profile: │Standard ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Tags: │test │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ │
│ ││ Add ││ Cancel ││ │
╰──────│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│───────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/library/add_artist_ui_tests.rs
expression: output
---
╭──────────────────────────────── Add - Test Artist (American pianist) ─────────────────────────────────╮
╭──────│ │───────╮
│Test A│ │ │
╰──────│ │───────╯
╭──────│ │───────╮
│ ✔ │ │ │
│=> │ │ │
│ │ │ │
│ │ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Root Folder: │/nfs/music ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭───────────────────────────────╮──────────────────────────────╮ │ │
│ │ │Standard │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ Monito│ │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ Qual│ │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ Metad│ │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ │ │ │ │ │
│ │ ╰───────────────────────────────╯──────────────────────────────╯ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ │
│ ││ Add ││ Cancel ││ │
╰──────│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│───────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/library/add_artist_ui_tests.rs
expression: output
---
╭──────────────────────────────── Add - Test Artist (American pianist) ─────────────────────────────────╮
╭──────│ │───────╮
│Test A│ │ │
╰──────│ │───────╯
╭──────│ │───────╮
│ ✔ │ │ │
│=> │ │ │
│ │ │ │
│ │ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Root Folder: │/nfs/music ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭───────────────────────────────╮──────────────────────────────╮ │ │
│ │ │All Albums │ ▼ │ │ │
│ │ │Future Albums │──────────────────────────────╯ │ │
│ │ │Missing Albums │──────────────────────────────╮ │ │
│ │ Monito│Existing Albums │ ▼ │ │ │
│ │ │First Album │──────────────────────────────╯ │ │
│ │ │Latest Album │──────────────────────────────╮ │ │
│ │ Qual│None │ ▼ │ │ │
│ │ │Unknown │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ Metad│ │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ │ │ │ │ │
│ │ ╰───────────────────────────────╯──────────────────────────────╯ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ │
│ ││ Add ││ Cancel ││ │
╰──────│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│───────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/library/add_artist_ui_tests.rs
expression: output
---
╭──────────────────────────────── Add - Test Artist (American pianist) ─────────────────────────────────╮
╭──────│ │───────╮
│Test A│ │ │
╰──────│ │───────╯
╭──────│ │───────╮
│ ✔ │ │ │
│=> │ │ │
│ │ │ │
│ │ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Root Folder: │/nfs/music ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭───────────────────────────────╮──────────────────────────────╮ │ │
│ │ │All Albums │ ▼ │ │ │
│ │ │No New Albums │──────────────────────────────╯ │ │
│ │ │New Albums │──────────────────────────────╮ │ │
│ │ Monito│ │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ Qual│ │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ Metad│ │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ │ │ │ │ │
│ │ ╰───────────────────────────────╯──────────────────────────────╯ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ │
│ ││ Add ││ Cancel ││ │
╰──────│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│───────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/library/add_artist_ui_tests.rs
expression: output
---
╭──────────────────────────────── Add - Test Artist (American pianist) ─────────────────────────────────╮
╭──────│ │───────╮
│Test A│ │ │
╰──────│ │───────╯
╭──────│ │───────╮
│ ✔ │ │ │
│=> │ │ │
│ │ │ │
│ │ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Root Folder: │/nfs/music ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭───────────────────────────────╮──────────────────────────────╮ │ │
│ │ │Any │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ Monito│ │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ Qual│ │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ Metad│ │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ │ │ │ │ │
│ │ ╰───────────────────────────────╯──────────────────────────────╯ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ │
│ ││ Add ││ Cancel ││ │
╰──────│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│───────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/library/add_artist_ui_tests.rs
expression: output
---
╭──────────────────────────────── Add - Test Artist (American pianist) ─────────────────────────────────╮
╭──────│ │───────╮
│Test A│ │ │
╰──────│ │───────╯
╭──────│ │───────╮
│ ✔ │ │ │
│=> │ │ │
│ │ │ │
│ │ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Root Folder: │/nfs/music ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭───────────────────────────────╮──────────────────────────────╮ │ │
│ │ │/nfs/music │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ Monito│ │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ Qual│ │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ Metad│ │ ▼ │ │ │
│ │ │ │──────────────────────────────╯ │ │
│ │ │ │──────────────────────────────╮ │ │
│ │ │ │ │ │ │
│ │ ╰───────────────────────────────╯──────────────────────────────╯ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ │
│ ││ Add ││ Cancel ││ │
╰──────│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│───────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/library/add_artist_ui_tests.rs
expression: output
---
╭──────────────────────────────── Add - Test Artist (American pianist) ─────────────────────────────────╮
╭──────│ │───────╮
│Test A│ │ │
╰──────│ │───────╯
╭──────│ │───────╮
│ ✔ │ │ │
│=> │ │ │
│ │ │ │
│ │ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Root Folder: │/nfs/music ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Monitor: │All Albums ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Monitor New Items: │All Albums ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Quality Profile: │Any ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Metadata Profile: │Standard ▼ │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ ╭─────────────────────────────────────────────────╮ │ │
│ │ Tags: │test │ │ │
│ │ ╰─────────────────────────────────────────────────╯ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ │
│ ││ Add ││ Cancel ││ │
╰──────│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│───────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯