feat(readarr): render the book details popup
Draw the book details popup over the author details view, with the editions table, book history, the book file info tab, and the manual search releases table, plus the automatic search, delete book file, download release, and history details prompts. Edition row styling is extracted into a named function so each branch is unit tested; text snapshots discard colour and cannot see it. The shared test fixture now populates the edition format, ISBN13, ASIN, and publisher, and the book file media info, so the rendered columns are exercised rather than blank.
This commit is contained in:
40 files changed
+2437
-6
No files matched your search
@@ -29,7 +29,7 @@ use strum::EnumIter;
|
|||||||
use {
|
use {
|
||||||
super::modals::EditionDetailsModal,
|
super::modals::EditionDetailsModal,
|
||||||
crate::models::readarr_models::{
|
crate::models::readarr_models::{
|
||||||
AuthorStatus, BookFile, DownloadStatus, Edition, MonitorType, NewItemMonitorType,
|
AuthorStatus, BookFile, DownloadStatus, Edition, MediaInfo, MonitorType, NewItemMonitorType,
|
||||||
ReadarrHistoryEventType, ReadarrTaskName,
|
ReadarrHistoryEventType, ReadarrTaskName,
|
||||||
},
|
},
|
||||||
crate::models::servarr_models::{IndexerField, Quality, QualityWrapper},
|
crate::models::servarr_models::{IndexerField, Quality, QualityWrapper},
|
||||||
@@ -461,6 +461,10 @@ impl ReadarrData<'_> {
|
|||||||
monitored: true,
|
monitored: true,
|
||||||
is_ebook: true,
|
is_ebook: true,
|
||||||
title: "Test Edition".to_owned(),
|
title: "Test Edition".to_owned(),
|
||||||
|
format: Some("Hardcover".to_owned()),
|
||||||
|
publisher: Some("DAW Books".to_owned()),
|
||||||
|
isbn13: Some("9780756404079".to_owned()),
|
||||||
|
asin: Some("B0043RSJ9S".to_owned()),
|
||||||
page_count: Some(288),
|
page_count: Some(288),
|
||||||
release_date: Some(date),
|
release_date: Some(date),
|
||||||
..Edition::default()
|
..Edition::default()
|
||||||
@@ -474,7 +478,13 @@ impl ReadarrData<'_> {
|
|||||||
size: 3543348019,
|
size: 3543348019,
|
||||||
date_added: date,
|
date_added: date,
|
||||||
quality: quality.clone(),
|
quality: quality.clone(),
|
||||||
media_info: None,
|
media_info: Some(MediaInfo {
|
||||||
|
audio_bit_rate: Some("128 kbps".to_owned()),
|
||||||
|
audio_channels: 2,
|
||||||
|
audio_codec: Some("MP3".to_owned()),
|
||||||
|
audio_bits: Some("16".to_owned()),
|
||||||
|
audio_sample_rate: Some("44100".to_owned()),
|
||||||
|
}),
|
||||||
quality_cutoff_not_met: false,
|
quality_cutoff_not_met: false,
|
||||||
}]);
|
}]);
|
||||||
book_details_modal
|
book_details_modal
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ use crate::models::readarr_models::{Book, ReadarrHistoryItem, ReadarrRelease};
|
|||||||
use crate::models::servarr_data::readarr::readarr_data::{
|
use crate::models::servarr_data::readarr::readarr_data::{
|
||||||
AUTHOR_DETAILS_BLOCKS, ActiveReadarrBlock,
|
AUTHOR_DETAILS_BLOCKS, ActiveReadarrBlock,
|
||||||
};
|
};
|
||||||
|
use crate::ui::readarr_ui::library::book_details_ui::BookDetailsUi;
|
||||||
use crate::ui::readarr_ui::readarr_ui_utils::create_history_event_details;
|
use crate::ui::readarr_ui::readarr_ui_utils::create_history_event_details;
|
||||||
use crate::ui::styles::{ManagarrStyle, secondary_style};
|
use crate::ui::styles::{ManagarrStyle, secondary_style};
|
||||||
use crate::ui::utils::decorate_peer_style;
|
use crate::ui::utils::decorate_peer_style;
|
||||||
@@ -41,7 +42,7 @@ impl DrawUi for AuthorDetailsUi {
|
|||||||
let Route::Readarr(active_readarr_block, _) = route else {
|
let Route::Readarr(active_readarr_block, _) = route else {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
AUTHOR_DETAILS_BLOCKS.contains(&active_readarr_block)
|
BookDetailsUi::accepts(route) || AUTHOR_DETAILS_BLOCKS.contains(&active_readarr_block)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) {
|
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) {
|
||||||
@@ -125,6 +126,10 @@ impl DrawUi for AuthorDetailsUi {
|
|||||||
};
|
};
|
||||||
|
|
||||||
draw_popup(f, app, draw_author_details_popup, Size::XXLarge);
|
draw_popup(f, app, draw_author_details_popup, Size::XXLarge);
|
||||||
|
|
||||||
|
if BookDetailsUi::accepts(route) {
|
||||||
|
BookDetailsUi::draw(f, app, _area);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ mod tests {
|
|||||||
|
|
||||||
use crate::models::readarr_models::{Book, BookStatistics};
|
use crate::models::readarr_models::{Book, BookStatistics};
|
||||||
use crate::models::servarr_data::readarr::readarr_data::{
|
use crate::models::servarr_data::readarr::readarr_data::{
|
||||||
AUTHOR_DETAILS_BLOCKS, ActiveReadarrBlock,
|
AUTHOR_DETAILS_BLOCKS, ActiveReadarrBlock, BOOK_DETAILS_BLOCKS,
|
||||||
};
|
};
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::readarr_ui::library::author_details_ui::{
|
use crate::ui::readarr_ui::library::author_details_ui::{
|
||||||
@@ -17,8 +17,11 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_author_details_ui_accepts() {
|
fn test_author_details_ui_accepts() {
|
||||||
|
let mut author_details_blocks = AUTHOR_DETAILS_BLOCKS.to_vec();
|
||||||
|
author_details_blocks.extend(BOOK_DETAILS_BLOCKS);
|
||||||
|
|
||||||
ActiveReadarrBlock::iter().for_each(|active_readarr_block| {
|
ActiveReadarrBlock::iter().for_each(|active_readarr_block| {
|
||||||
if AUTHOR_DETAILS_BLOCKS.contains(&active_readarr_block) {
|
if author_details_blocks.contains(&active_readarr_block) {
|
||||||
assert!(AuthorDetailsUi::accepts(active_readarr_block.into()));
|
assert!(AuthorDetailsUi::accepts(active_readarr_block.into()));
|
||||||
} else {
|
} else {
|
||||||
assert!(!AuthorDetailsUi::accepts(active_readarr_block.into()));
|
assert!(!AuthorDetailsUi::accepts(active_readarr_block.into()));
|
||||||
@@ -295,5 +298,17 @@ mod tests {
|
|||||||
|
|
||||||
insta::assert_snapshot!(output);
|
insta::assert_snapshot!(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_author_details_ui_renders_book_details_over_author_details() {
|
||||||
|
let mut app = App::test_default_fully_populated();
|
||||||
|
app.push_navigation_stack(ActiveReadarrBlock::BookDetails.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||||
|
AuthorDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,550 @@
|
|||||||
|
use crate::app::App;
|
||||||
|
use crate::models::Route;
|
||||||
|
use crate::models::readarr_models::{BookFile, Edition, ReadarrHistoryItem, ReadarrRelease};
|
||||||
|
use crate::models::servarr_data::readarr::readarr_data::{ActiveReadarrBlock, BOOK_DETAILS_BLOCKS};
|
||||||
|
use crate::ui::readarr_ui::readarr_ui_utils::create_history_event_details;
|
||||||
|
use crate::ui::styles::{ManagarrStyle, secondary_style};
|
||||||
|
use crate::ui::utils::{
|
||||||
|
borderless_block, decorate_peer_style, get_width_from_percentage, layout_block_top_border,
|
||||||
|
};
|
||||||
|
use crate::ui::widgets::confirmation_prompt::ConfirmationPrompt;
|
||||||
|
use crate::ui::widgets::loading_block::LoadingBlock;
|
||||||
|
use crate::ui::widgets::managarr_table::ManagarrTable;
|
||||||
|
use crate::ui::widgets::message::Message;
|
||||||
|
use crate::ui::widgets::popup::{Popup, Size};
|
||||||
|
use crate::ui::{DrawUi, draw_popup, draw_tabs};
|
||||||
|
use crate::utils::convert_to_gb;
|
||||||
|
use ratatui::Frame;
|
||||||
|
use ratatui::layout::{Alignment, Constraint, Rect};
|
||||||
|
use ratatui::prelude::{Line, Stylize, Text};
|
||||||
|
use ratatui::widgets::{Cell, Paragraph, Row, Wrap};
|
||||||
|
use serde_json::Number;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
#[path = "book_details_ui_tests.rs"]
|
||||||
|
mod book_details_ui_tests;
|
||||||
|
|
||||||
|
pub(super) struct BookDetailsUi;
|
||||||
|
|
||||||
|
impl DrawUi for BookDetailsUi {
|
||||||
|
fn accepts(route: Route) -> bool {
|
||||||
|
let Route::Readarr(active_readarr_block, _) = route else {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
BOOK_DETAILS_BLOCKS.contains(&active_readarr_block)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) {
|
||||||
|
if app.data.readarr_data.book_details_modal.is_some()
|
||||||
|
&& let Route::Readarr(active_readarr_block, _) = app.get_current_route()
|
||||||
|
{
|
||||||
|
let draw_book_details_popup = |f: &mut Frame<'_>, app: &mut App<'_>, popup_area: Rect| {
|
||||||
|
let content_area = draw_tabs(
|
||||||
|
f,
|
||||||
|
popup_area,
|
||||||
|
&format!(
|
||||||
|
"{} Details",
|
||||||
|
app.data.readarr_data.books.current_selection().title.text
|
||||||
|
),
|
||||||
|
&app
|
||||||
|
.data
|
||||||
|
.readarr_data
|
||||||
|
.book_details_modal
|
||||||
|
.as_ref()
|
||||||
|
.expect("Book details modal is undefined")
|
||||||
|
.book_details_tabs,
|
||||||
|
);
|
||||||
|
draw_book_details(f, app, content_area);
|
||||||
|
|
||||||
|
match active_readarr_block {
|
||||||
|
ActiveReadarrBlock::AutomaticallySearchBookPrompt => {
|
||||||
|
let prompt = format!(
|
||||||
|
"Do you want to trigger an automatic search of your indexers for the book: {}?",
|
||||||
|
app.data.readarr_data.books.current_selection().title.text
|
||||||
|
);
|
||||||
|
let confirmation_prompt = ConfirmationPrompt::new()
|
||||||
|
.title("Automatic Book Search")
|
||||||
|
.prompt(&prompt)
|
||||||
|
.yes_no_value(app.data.readarr_data.prompt_confirm);
|
||||||
|
|
||||||
|
f.render_widget(
|
||||||
|
Popup::new(confirmation_prompt).size(Size::MediumPrompt),
|
||||||
|
f.area(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
ActiveReadarrBlock::DeleteBookFilePrompt => {
|
||||||
|
let prompt = format!(
|
||||||
|
"Do you really want to delete this book file: \n{}?",
|
||||||
|
app.data.readarr_data.books.current_selection().title.text
|
||||||
|
);
|
||||||
|
let confirmation_prompt = ConfirmationPrompt::new()
|
||||||
|
.title("Delete Book File")
|
||||||
|
.prompt(&prompt)
|
||||||
|
.yes_no_value(app.data.readarr_data.prompt_confirm);
|
||||||
|
|
||||||
|
f.render_widget(
|
||||||
|
Popup::new(confirmation_prompt).size(Size::MediumPrompt),
|
||||||
|
f.area(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
ActiveReadarrBlock::ManualBookSearchConfirmPrompt => {
|
||||||
|
draw_manual_book_search_confirm_prompt(f, app);
|
||||||
|
}
|
||||||
|
ActiveReadarrBlock::BookHistoryDetails => {
|
||||||
|
draw_history_item_details_popup(f, app);
|
||||||
|
}
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
draw_popup(f, app, draw_book_details_popup, Size::XLarge);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw_book_details(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||||
|
if let Some(book_details_modal) = app.data.readarr_data.book_details_modal.as_ref()
|
||||||
|
&& let Route::Readarr(active_readarr_block, _) =
|
||||||
|
book_details_modal.book_details_tabs.get_active_route()
|
||||||
|
{
|
||||||
|
match active_readarr_block {
|
||||||
|
ActiveReadarrBlock::BookDetails => draw_editions_table(f, app, area),
|
||||||
|
ActiveReadarrBlock::BookHistory => draw_book_history_table(f, app, area),
|
||||||
|
ActiveReadarrBlock::BookFileInfo => draw_book_file_info(f, app, area),
|
||||||
|
ActiveReadarrBlock::ManualBookSearch => draw_book_releases(f, app, area),
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw_editions_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||||
|
if let Route::Readarr(active_readarr_block, _) = app.get_current_route() {
|
||||||
|
let content = Some(
|
||||||
|
&mut app
|
||||||
|
.data
|
||||||
|
.readarr_data
|
||||||
|
.book_details_modal
|
||||||
|
.as_mut()
|
||||||
|
.expect("Book details modal is undefined")
|
||||||
|
.editions,
|
||||||
|
);
|
||||||
|
|
||||||
|
let edition_row_mapping = |edition: &Edition| {
|
||||||
|
let Edition {
|
||||||
|
format,
|
||||||
|
isbn13,
|
||||||
|
asin,
|
||||||
|
publisher,
|
||||||
|
page_count,
|
||||||
|
release_date,
|
||||||
|
monitored,
|
||||||
|
..
|
||||||
|
} = edition;
|
||||||
|
|
||||||
|
let page_count = page_count
|
||||||
|
.map(|count| count.to_string())
|
||||||
|
.unwrap_or_default();
|
||||||
|
let release_date = release_date
|
||||||
|
.map(|date| date.format("%Y-%m-%d").to_string())
|
||||||
|
.unwrap_or_default();
|
||||||
|
let monitored = if *monitored { "🏷" } else { "" };
|
||||||
|
|
||||||
|
decorate_edition_row_with_style(
|
||||||
|
edition,
|
||||||
|
Row::new(vec![
|
||||||
|
Cell::from(format.clone().unwrap_or_default()),
|
||||||
|
Cell::from(isbn13.clone().unwrap_or_default()),
|
||||||
|
Cell::from(asin.clone().unwrap_or_default()),
|
||||||
|
Cell::from(publisher.clone().unwrap_or_default()),
|
||||||
|
Cell::from(page_count),
|
||||||
|
Cell::from(release_date),
|
||||||
|
Cell::from(monitored.to_owned()),
|
||||||
|
]),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
let is_searching = active_readarr_block == ActiveReadarrBlock::SearchEditions;
|
||||||
|
let editions_table = ManagarrTable::new(content, edition_row_mapping)
|
||||||
|
.block(layout_block_top_border())
|
||||||
|
.loading(app.is_loading)
|
||||||
|
.searching(is_searching)
|
||||||
|
.search_produced_empty_results(
|
||||||
|
active_readarr_block == ActiveReadarrBlock::SearchEditionsError,
|
||||||
|
)
|
||||||
|
.headers([
|
||||||
|
"Format",
|
||||||
|
"ISBN13",
|
||||||
|
"ASIN",
|
||||||
|
"Publisher",
|
||||||
|
"Page Count",
|
||||||
|
"Release Date",
|
||||||
|
"Monitored",
|
||||||
|
])
|
||||||
|
.constraints([
|
||||||
|
Constraint::Percentage(14),
|
||||||
|
Constraint::Percentage(16),
|
||||||
|
Constraint::Percentage(14),
|
||||||
|
Constraint::Percentage(21),
|
||||||
|
Constraint::Percentage(11),
|
||||||
|
Constraint::Percentage(14),
|
||||||
|
Constraint::Percentage(10),
|
||||||
|
]);
|
||||||
|
|
||||||
|
if is_searching {
|
||||||
|
editions_table.show_cursor(f, area);
|
||||||
|
}
|
||||||
|
|
||||||
|
f.render_widget(editions_table, area);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn decorate_edition_row_with_style<'a>(edition: &Edition, row: Row<'a>) -> Row<'a> {
|
||||||
|
if edition.monitored {
|
||||||
|
row.primary()
|
||||||
|
} else {
|
||||||
|
row.unmonitored()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw_book_file_info(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||||
|
match app.data.readarr_data.book_details_modal.as_ref() {
|
||||||
|
Some(book_details_modal) if !app.is_loading && !book_details_modal.book_files.is_empty() => {
|
||||||
|
let content = Some(
|
||||||
|
&mut app
|
||||||
|
.data
|
||||||
|
.readarr_data
|
||||||
|
.book_details_modal
|
||||||
|
.as_mut()
|
||||||
|
.expect("Book details modal is undefined")
|
||||||
|
.book_files,
|
||||||
|
);
|
||||||
|
|
||||||
|
let book_file_row_mapping = |book_file: &BookFile| {
|
||||||
|
let BookFile {
|
||||||
|
path,
|
||||||
|
size,
|
||||||
|
quality,
|
||||||
|
media_info,
|
||||||
|
..
|
||||||
|
} = book_file;
|
||||||
|
|
||||||
|
let size = convert_to_gb(*size);
|
||||||
|
let audio_info = media_info
|
||||||
|
.as_ref()
|
||||||
|
.map(|media_info| {
|
||||||
|
let codec = media_info.audio_codec.as_deref().unwrap_or("");
|
||||||
|
let channels = format!("{}.0", media_info.audio_channels);
|
||||||
|
let bitrate = media_info.audio_bit_rate.as_deref().unwrap_or("");
|
||||||
|
let sample_rate = media_info.audio_sample_rate.as_deref().unwrap_or("");
|
||||||
|
let bits = media_info.audio_bits.as_deref().unwrap_or("");
|
||||||
|
format!("{codec} - {channels} - {bitrate} - {sample_rate} - {bits}")
|
||||||
|
})
|
||||||
|
.unwrap_or_default();
|
||||||
|
|
||||||
|
Row::new(vec![
|
||||||
|
Cell::from(path.clone()),
|
||||||
|
Cell::from(format!("{size:.2} GB")),
|
||||||
|
Cell::from(quality.quality.name.clone()),
|
||||||
|
Cell::from(audio_info),
|
||||||
|
])
|
||||||
|
.primary()
|
||||||
|
};
|
||||||
|
|
||||||
|
let book_files_table = ManagarrTable::new(content, book_file_row_mapping)
|
||||||
|
.block(layout_block_top_border())
|
||||||
|
.loading(app.is_loading)
|
||||||
|
.headers(["Path", "Size", "Quality", "Media Info"])
|
||||||
|
.constraints([
|
||||||
|
Constraint::Percentage(45),
|
||||||
|
Constraint::Percentage(11),
|
||||||
|
Constraint::Percentage(14),
|
||||||
|
Constraint::Percentage(30),
|
||||||
|
]);
|
||||||
|
|
||||||
|
f.render_widget(book_files_table, area);
|
||||||
|
}
|
||||||
|
_ => f.render_widget(
|
||||||
|
LoadingBlock::new(
|
||||||
|
app.is_loading || app.data.readarr_data.book_details_modal.is_none(),
|
||||||
|
layout_block_top_border(),
|
||||||
|
),
|
||||||
|
area,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw_book_history_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||||
|
match app.data.readarr_data.book_details_modal.as_ref() {
|
||||||
|
Some(book_details_modal) if !app.is_loading => {
|
||||||
|
let current_selection = if book_details_modal.book_history.is_empty() {
|
||||||
|
ReadarrHistoryItem::default()
|
||||||
|
} else {
|
||||||
|
book_details_modal.book_history.current_selection().clone()
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Route::Readarr(active_readarr_block, _) = app.get_current_route() {
|
||||||
|
let history_row_mapping = |history_item: &ReadarrHistoryItem| {
|
||||||
|
let ReadarrHistoryItem {
|
||||||
|
source_title,
|
||||||
|
quality,
|
||||||
|
event_type,
|
||||||
|
date,
|
||||||
|
..
|
||||||
|
} = history_item;
|
||||||
|
|
||||||
|
source_title.scroll_left_or_reset(
|
||||||
|
get_width_from_percentage(area, 40),
|
||||||
|
current_selection == *history_item,
|
||||||
|
app.should_text_scroll,
|
||||||
|
);
|
||||||
|
|
||||||
|
Row::new(vec![
|
||||||
|
Cell::from(source_title.to_string()),
|
||||||
|
Cell::from(event_type.to_string()),
|
||||||
|
Cell::from(quality.quality.name.to_owned()),
|
||||||
|
Cell::from(date.to_string()),
|
||||||
|
])
|
||||||
|
.primary()
|
||||||
|
};
|
||||||
|
let mut book_history_table = &mut app
|
||||||
|
.data
|
||||||
|
.readarr_data
|
||||||
|
.book_details_modal
|
||||||
|
.as_mut()
|
||||||
|
.expect("Book details modal is undefined")
|
||||||
|
.book_history;
|
||||||
|
let history_table = ManagarrTable::new(Some(&mut book_history_table), history_row_mapping)
|
||||||
|
.block(layout_block_top_border())
|
||||||
|
.loading(app.is_loading)
|
||||||
|
.sorting(active_readarr_block == ActiveReadarrBlock::BookHistorySortPrompt)
|
||||||
|
.searching(active_readarr_block == ActiveReadarrBlock::SearchBookHistory)
|
||||||
|
.search_produced_empty_results(
|
||||||
|
active_readarr_block == ActiveReadarrBlock::SearchBookHistoryError,
|
||||||
|
)
|
||||||
|
.filtering(active_readarr_block == ActiveReadarrBlock::FilterBookHistory)
|
||||||
|
.filter_produced_empty_results(
|
||||||
|
active_readarr_block == ActiveReadarrBlock::FilterBookHistoryError,
|
||||||
|
)
|
||||||
|
.headers(["Source Title", "Event Type", "Quality", "Date"])
|
||||||
|
.constraints([
|
||||||
|
Constraint::Percentage(40),
|
||||||
|
Constraint::Percentage(20),
|
||||||
|
Constraint::Percentage(15),
|
||||||
|
Constraint::Percentage(25),
|
||||||
|
]);
|
||||||
|
|
||||||
|
if [
|
||||||
|
ActiveReadarrBlock::SearchBookHistory,
|
||||||
|
ActiveReadarrBlock::FilterBookHistory,
|
||||||
|
]
|
||||||
|
.contains(&active_readarr_block)
|
||||||
|
{
|
||||||
|
history_table.show_cursor(f, area);
|
||||||
|
}
|
||||||
|
|
||||||
|
f.render_widget(history_table, area);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => f.render_widget(
|
||||||
|
LoadingBlock::new(
|
||||||
|
app.is_loading || app.data.readarr_data.book_details_modal.is_none(),
|
||||||
|
layout_block_top_border(),
|
||||||
|
),
|
||||||
|
area,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw_book_releases(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||||
|
match app.data.readarr_data.book_details_modal.as_ref() {
|
||||||
|
Some(book_details_modal) if !app.is_loading => {
|
||||||
|
let (current_selection, is_empty) = if book_details_modal.book_releases.is_empty() {
|
||||||
|
(ReadarrRelease::default(), true)
|
||||||
|
} else {
|
||||||
|
(
|
||||||
|
book_details_modal.book_releases.current_selection().clone(),
|
||||||
|
book_details_modal.book_releases.is_empty(),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Route::Readarr(active_readarr_block, _) = app.get_current_route() {
|
||||||
|
let book_release_row_mapping = |release: &ReadarrRelease| {
|
||||||
|
let ReadarrRelease {
|
||||||
|
protocol,
|
||||||
|
age,
|
||||||
|
title,
|
||||||
|
indexer,
|
||||||
|
size,
|
||||||
|
rejected,
|
||||||
|
seeders,
|
||||||
|
leechers,
|
||||||
|
quality,
|
||||||
|
..
|
||||||
|
} = release;
|
||||||
|
|
||||||
|
let age = format!("{age} days");
|
||||||
|
title.scroll_left_or_reset(
|
||||||
|
get_width_from_percentage(area, 35),
|
||||||
|
current_selection == *release
|
||||||
|
&& active_readarr_block != ActiveReadarrBlock::ManualBookSearchConfirmPrompt,
|
||||||
|
app.should_text_scroll,
|
||||||
|
);
|
||||||
|
let size = convert_to_gb(*size);
|
||||||
|
let rejected_str = if *rejected { "⛔" } else { "" };
|
||||||
|
let peers = if seeders.is_none() || leechers.is_none() {
|
||||||
|
Text::from("")
|
||||||
|
} else {
|
||||||
|
let seeders = seeders
|
||||||
|
.clone()
|
||||||
|
.unwrap_or(Number::from(0u64))
|
||||||
|
.as_u64()
|
||||||
|
.unwrap_or_default();
|
||||||
|
let leechers = leechers
|
||||||
|
.clone()
|
||||||
|
.unwrap_or(Number::from(0u64))
|
||||||
|
.as_u64()
|
||||||
|
.unwrap_or_default();
|
||||||
|
|
||||||
|
decorate_peer_style(
|
||||||
|
seeders,
|
||||||
|
leechers,
|
||||||
|
Text::from(format!("{seeders} / {leechers}")),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
let quality_name = quality.quality.name.clone();
|
||||||
|
|
||||||
|
Row::new(vec![
|
||||||
|
Cell::from(protocol.clone()),
|
||||||
|
Cell::from(age),
|
||||||
|
Cell::from(rejected_str),
|
||||||
|
Cell::from(title.to_string()),
|
||||||
|
Cell::from(indexer.clone()),
|
||||||
|
Cell::from(format!("{size:.1} GB")),
|
||||||
|
Cell::from(peers),
|
||||||
|
Cell::from(quality_name),
|
||||||
|
])
|
||||||
|
.primary()
|
||||||
|
};
|
||||||
|
let mut book_release_table = &mut app
|
||||||
|
.data
|
||||||
|
.readarr_data
|
||||||
|
.book_details_modal
|
||||||
|
.as_mut()
|
||||||
|
.expect("Book details modal is undefined")
|
||||||
|
.book_releases;
|
||||||
|
let release_table =
|
||||||
|
ManagarrTable::new(Some(&mut book_release_table), book_release_row_mapping)
|
||||||
|
.block(layout_block_top_border())
|
||||||
|
.loading(app.is_loading || is_empty)
|
||||||
|
.sorting(active_readarr_block == ActiveReadarrBlock::ManualBookSearchSortPrompt)
|
||||||
|
.headers([
|
||||||
|
"Source", "Age", "⛔", "Title", "Indexer", "Size", "Peers", "Quality",
|
||||||
|
])
|
||||||
|
.constraints([
|
||||||
|
Constraint::Length(9),
|
||||||
|
Constraint::Length(10),
|
||||||
|
Constraint::Length(5),
|
||||||
|
Constraint::Percentage(35),
|
||||||
|
Constraint::Percentage(15),
|
||||||
|
Constraint::Length(12),
|
||||||
|
Constraint::Length(12),
|
||||||
|
Constraint::Percentage(10),
|
||||||
|
]);
|
||||||
|
|
||||||
|
f.render_widget(release_table, area);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => f.render_widget(
|
||||||
|
LoadingBlock::new(
|
||||||
|
app.is_loading || app.data.readarr_data.book_details_modal.is_none(),
|
||||||
|
layout_block_top_border(),
|
||||||
|
),
|
||||||
|
area,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw_manual_book_search_confirm_prompt(f: &mut Frame<'_>, app: &mut App<'_>) {
|
||||||
|
let current_selection = app
|
||||||
|
.data
|
||||||
|
.readarr_data
|
||||||
|
.book_details_modal
|
||||||
|
.as_ref()
|
||||||
|
.expect("Book details modal is undefined")
|
||||||
|
.book_releases
|
||||||
|
.current_selection();
|
||||||
|
let title = if current_selection.rejected {
|
||||||
|
"Download Rejected Release"
|
||||||
|
} else {
|
||||||
|
"Download Release"
|
||||||
|
};
|
||||||
|
let prompt = if current_selection.rejected {
|
||||||
|
format!(
|
||||||
|
"Do you really want to download the rejected release: {}?",
|
||||||
|
current_selection.title.text
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
format!(
|
||||||
|
"Do you want to download the release: {}?",
|
||||||
|
current_selection.title.text
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
if current_selection.rejected {
|
||||||
|
let mut lines_vec = vec![Line::from("Rejection reasons: ".primary().bold())];
|
||||||
|
let mut rejections_spans = current_selection
|
||||||
|
.rejections
|
||||||
|
.clone()
|
||||||
|
.unwrap_or_default()
|
||||||
|
.iter()
|
||||||
|
.map(|item| Line::from(format!("• {item}").primary().bold()))
|
||||||
|
.collect::<Vec<Line<'_>>>();
|
||||||
|
lines_vec.append(&mut rejections_spans);
|
||||||
|
|
||||||
|
let content_paragraph = Paragraph::new(lines_vec)
|
||||||
|
.block(borderless_block())
|
||||||
|
.wrap(Wrap { trim: false })
|
||||||
|
.left_aligned();
|
||||||
|
let confirmation_prompt = ConfirmationPrompt::new()
|
||||||
|
.title(title)
|
||||||
|
.prompt(&prompt)
|
||||||
|
.content(content_paragraph)
|
||||||
|
.yes_no_value(app.data.readarr_data.prompt_confirm);
|
||||||
|
|
||||||
|
f.render_widget(Popup::new(confirmation_prompt).size(Size::Small), f.area());
|
||||||
|
} else {
|
||||||
|
let confirmation_prompt = ConfirmationPrompt::new()
|
||||||
|
.title(title)
|
||||||
|
.prompt(&prompt)
|
||||||
|
.yes_no_value(app.data.readarr_data.prompt_confirm);
|
||||||
|
|
||||||
|
f.render_widget(
|
||||||
|
Popup::new(confirmation_prompt).size(Size::MediumPrompt),
|
||||||
|
f.area(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw_history_item_details_popup(f: &mut Frame<'_>, app: &mut App<'_>) {
|
||||||
|
let current_selection =
|
||||||
|
if let Some(book_details_modal) = app.data.readarr_data.book_details_modal.as_ref() {
|
||||||
|
if book_details_modal.book_history.is_empty() {
|
||||||
|
ReadarrHistoryItem::default()
|
||||||
|
} else {
|
||||||
|
book_details_modal.book_history.current_selection().clone()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ReadarrHistoryItem::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
let line_vec = create_history_event_details(current_selection);
|
||||||
|
let text = Text::from(line_vec);
|
||||||
|
|
||||||
|
let message = Message::new(text)
|
||||||
|
.title("Details")
|
||||||
|
.style(secondary_style())
|
||||||
|
.alignment(Alignment::Left);
|
||||||
|
|
||||||
|
f.render_widget(Popup::new(message).size(Size::NarrowLongMessage), f.area());
|
||||||
|
}
|
||||||
@@ -0,0 +1,242 @@
|
|||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use pretty_assertions::assert_eq;
|
||||||
|
use ratatui::widgets::{Cell, Row};
|
||||||
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::readarr_models::Edition;
|
||||||
|
use crate::models::servarr_data::readarr::readarr_data::{
|
||||||
|
ActiveReadarrBlock, BOOK_DETAILS_BLOCKS,
|
||||||
|
};
|
||||||
|
use crate::ui::DrawUi;
|
||||||
|
use crate::ui::readarr_ui::library::book_details_ui::{
|
||||||
|
BookDetailsUi, decorate_edition_row_with_style,
|
||||||
|
};
|
||||||
|
use crate::ui::styles::ManagarrStyle;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_book_details_ui_accepts() {
|
||||||
|
ActiveReadarrBlock::iter().for_each(|active_readarr_block| {
|
||||||
|
if BOOK_DETAILS_BLOCKS.contains(&active_readarr_block) {
|
||||||
|
assert!(BookDetailsUi::accepts(active_readarr_block.into()));
|
||||||
|
} else {
|
||||||
|
assert!(!BookDetailsUi::accepts(active_readarr_block.into()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_decorate_edition_row_with_style_monitored() {
|
||||||
|
let edition = Edition {
|
||||||
|
monitored: true,
|
||||||
|
..Edition::default()
|
||||||
|
};
|
||||||
|
let row = Row::new(vec![Cell::from("test".to_owned())]);
|
||||||
|
|
||||||
|
let style = decorate_edition_row_with_style(&edition, row.clone());
|
||||||
|
|
||||||
|
assert_eq!(style, row.primary());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_decorate_edition_row_with_style_unmonitored() {
|
||||||
|
let edition = Edition {
|
||||||
|
monitored: false,
|
||||||
|
..Edition::default()
|
||||||
|
};
|
||||||
|
let row = Row::new(vec![Cell::from("test".to_owned())]);
|
||||||
|
|
||||||
|
let style = decorate_edition_row_with_style(&edition, row.clone());
|
||||||
|
|
||||||
|
assert_eq!(style, row.unmonitored());
|
||||||
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::TerminalSize;
|
||||||
|
use rstest::rstest;
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[rstest]
|
||||||
|
#[case(ActiveReadarrBlock::BookDetails, 0)]
|
||||||
|
#[case(ActiveReadarrBlock::SearchEditions, 0)]
|
||||||
|
#[case(ActiveReadarrBlock::SearchEditionsError, 0)]
|
||||||
|
#[case(ActiveReadarrBlock::AutomaticallySearchBookPrompt, 0)]
|
||||||
|
#[case(ActiveReadarrBlock::AutomaticallySearchBookPrompt, 1)]
|
||||||
|
#[case(ActiveReadarrBlock::AutomaticallySearchBookPrompt, 2)]
|
||||||
|
#[case(ActiveReadarrBlock::AutomaticallySearchBookPrompt, 3)]
|
||||||
|
#[case(ActiveReadarrBlock::DeleteBookFilePrompt, 0)]
|
||||||
|
#[case(ActiveReadarrBlock::DeleteBookFilePrompt, 2)]
|
||||||
|
#[case(ActiveReadarrBlock::BookHistory, 1)]
|
||||||
|
#[case(ActiveReadarrBlock::SearchBookHistory, 1)]
|
||||||
|
#[case(ActiveReadarrBlock::SearchBookHistoryError, 1)]
|
||||||
|
#[case(ActiveReadarrBlock::FilterBookHistory, 1)]
|
||||||
|
#[case(ActiveReadarrBlock::FilterBookHistoryError, 1)]
|
||||||
|
#[case(ActiveReadarrBlock::BookHistorySortPrompt, 1)]
|
||||||
|
#[case(ActiveReadarrBlock::BookHistoryDetails, 1)]
|
||||||
|
#[case(ActiveReadarrBlock::BookFileInfo, 2)]
|
||||||
|
#[case(ActiveReadarrBlock::ManualBookSearch, 3)]
|
||||||
|
#[case(ActiveReadarrBlock::ManualBookSearchConfirmPrompt, 3)]
|
||||||
|
#[case(ActiveReadarrBlock::ManualBookSearchSortPrompt, 3)]
|
||||||
|
fn test_book_details_ui_renders(
|
||||||
|
#[case] active_readarr_block: ActiveReadarrBlock,
|
||||||
|
#[case] index: usize,
|
||||||
|
) {
|
||||||
|
let mut app = App::test_default_fully_populated();
|
||||||
|
app.push_navigation_stack(active_readarr_block.into());
|
||||||
|
app
|
||||||
|
.data
|
||||||
|
.readarr_data
|
||||||
|
.book_details_modal
|
||||||
|
.as_mut()
|
||||||
|
.unwrap()
|
||||||
|
.book_details_tabs
|
||||||
|
.set_index(index);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||||
|
BookDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(
|
||||||
|
format!("book_details_renders_{active_readarr_block}_{index}"),
|
||||||
|
output
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[rstest]
|
||||||
|
#[case(ActiveReadarrBlock::BookDetails, 0)]
|
||||||
|
#[case(ActiveReadarrBlock::BookHistory, 1)]
|
||||||
|
#[case(ActiveReadarrBlock::BookFileInfo, 2)]
|
||||||
|
#[case(ActiveReadarrBlock::ManualBookSearch, 3)]
|
||||||
|
fn test_book_details_ui_renders_loading(
|
||||||
|
#[case] active_readarr_block: ActiveReadarrBlock,
|
||||||
|
#[case] index: usize,
|
||||||
|
) {
|
||||||
|
let mut app = App::test_default_fully_populated();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(active_readarr_block.into());
|
||||||
|
{
|
||||||
|
let book_details_modal = app.data.readarr_data.book_details_modal.as_mut().unwrap();
|
||||||
|
book_details_modal.editions = StatefulTable::default();
|
||||||
|
book_details_modal.book_files = StatefulTable::default();
|
||||||
|
book_details_modal.book_history = StatefulTable::default();
|
||||||
|
book_details_modal.book_releases = StatefulTable::default();
|
||||||
|
book_details_modal.book_details_tabs.set_index(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||||
|
BookDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(
|
||||||
|
format!("loading_book_details_{active_readarr_block}_{index}"),
|
||||||
|
output
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[rstest]
|
||||||
|
#[case(ActiveReadarrBlock::BookDetails, 0)]
|
||||||
|
#[case(ActiveReadarrBlock::BookHistory, 1)]
|
||||||
|
#[case(ActiveReadarrBlock::BookFileInfo, 2)]
|
||||||
|
#[case(ActiveReadarrBlock::ManualBookSearch, 3)]
|
||||||
|
fn test_book_details_ui_renders_empty(
|
||||||
|
#[case] active_readarr_block: ActiveReadarrBlock,
|
||||||
|
#[case] index: usize,
|
||||||
|
) {
|
||||||
|
let mut app = App::test_default_fully_populated();
|
||||||
|
app.push_navigation_stack(active_readarr_block.into());
|
||||||
|
{
|
||||||
|
let book_details_modal = app.data.readarr_data.book_details_modal.as_mut().unwrap();
|
||||||
|
book_details_modal.editions = StatefulTable::default();
|
||||||
|
book_details_modal.book_files = StatefulTable::default();
|
||||||
|
book_details_modal.book_history = StatefulTable::default();
|
||||||
|
book_details_modal.book_releases = StatefulTable::default();
|
||||||
|
book_details_modal.book_details_tabs.set_index(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||||
|
BookDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(
|
||||||
|
format!("empty_book_details_{active_readarr_block}_{index}"),
|
||||||
|
output
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_book_details_ui_renders_editions_table_with_zero_editions() {
|
||||||
|
let mut app = App::test_default_fully_populated();
|
||||||
|
app.push_navigation_stack(ActiveReadarrBlock::BookDetails.into());
|
||||||
|
app
|
||||||
|
.data
|
||||||
|
.readarr_data
|
||||||
|
.book_details_modal
|
||||||
|
.as_mut()
|
||||||
|
.unwrap()
|
||||||
|
.editions = StatefulTable::default();
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||||
|
BookDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_book_details_ui_renders_editions_table_with_a_single_edition() {
|
||||||
|
let mut app = App::test_default_fully_populated();
|
||||||
|
app.push_navigation_stack(ActiveReadarrBlock::BookDetails.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||||
|
BookDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_book_details_ui_renders_editions_table_with_an_unmonitored_edition() {
|
||||||
|
let mut app = App::test_default_fully_populated();
|
||||||
|
app.push_navigation_stack(ActiveReadarrBlock::BookDetails.into());
|
||||||
|
app
|
||||||
|
.data
|
||||||
|
.readarr_data
|
||||||
|
.book_details_modal
|
||||||
|
.as_mut()
|
||||||
|
.unwrap()
|
||||||
|
.editions
|
||||||
|
.set_items(vec![Edition {
|
||||||
|
monitored: false,
|
||||||
|
format: Some("Paperback".to_owned()),
|
||||||
|
isbn13: Some("9780756404741".to_owned()),
|
||||||
|
asin: Some("B0043RSJ9S".to_owned()),
|
||||||
|
publisher: Some("DAW Books".to_owned()),
|
||||||
|
page_count: Some(662),
|
||||||
|
..Edition::default()
|
||||||
|
}]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||||
|
BookDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_book_details_ui_renders_nothing_when_the_book_details_modal_is_undefined() {
|
||||||
|
let mut app = App::test_default_fully_populated();
|
||||||
|
app.push_navigation_stack(ActiveReadarrBlock::BookDetails.into());
|
||||||
|
app.data.readarr_data.book_details_modal = None;
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||||
|
BookDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@ mod tests {
|
|||||||
|
|
||||||
use crate::models::readarr_models::{Author, AuthorStatistics, AuthorStatus};
|
use crate::models::readarr_models::{Author, AuthorStatistics, AuthorStatus};
|
||||||
use crate::models::servarr_data::readarr::readarr_data::{
|
use crate::models::servarr_data::readarr::readarr_data::{
|
||||||
AUTHOR_DETAILS_BLOCKS, ActiveReadarrBlock, LIBRARY_BLOCKS,
|
AUTHOR_DETAILS_BLOCKS, ActiveReadarrBlock, BOOK_DETAILS_BLOCKS, LIBRARY_BLOCKS,
|
||||||
};
|
};
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::readarr_ui::library::{LibraryUi, decorate_author_row_with_style};
|
use crate::ui::readarr_ui::library::{LibraryUi, decorate_author_row_with_style};
|
||||||
@@ -16,6 +16,7 @@ mod tests {
|
|||||||
fn test_library_ui_accepts() {
|
fn test_library_ui_accepts() {
|
||||||
let mut blocks = LIBRARY_BLOCKS.to_vec();
|
let mut blocks = LIBRARY_BLOCKS.to_vec();
|
||||||
blocks.extend(AUTHOR_DETAILS_BLOCKS);
|
blocks.extend(AUTHOR_DETAILS_BLOCKS);
|
||||||
|
blocks.extend(BOOK_DETAILS_BLOCKS);
|
||||||
|
|
||||||
for active_readarr_block in ActiveReadarrBlock::iter() {
|
for active_readarr_block in ActiveReadarrBlock::iter() {
|
||||||
if blocks.contains(&active_readarr_block) {
|
if blocks.contains(&active_readarr_block) {
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ use crate::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
mod author_details_ui;
|
mod author_details_ui;
|
||||||
|
mod book_details_ui;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
#[path = "library_ui_tests.rs"]
|
#[path = "library_ui_tests.rs"]
|
||||||
|
|||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/author_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Author ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│Auth╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │
|
||||||
|
│Over│ Editions │ History │ File │ Manual Search │ │
|
||||||
|
│Stat│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ │
|
||||||
|
│Genr│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │ │
|
||||||
|
│Rati│=> Hardcover 9780756404079 B0043RSJ9S DAW Books 288 2023-05-20 🏷 │ │
|
||||||
|
│Path│ │ │
|
||||||
|
│Qual│ │ │
|
||||||
|
│Meta│ │ │
|
||||||
|
│Moni│ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│╭ A│ │─────╮│
|
||||||
|
││ Bo│ │ ││
|
||||||
|
││───│ │─────││
|
||||||
|
││ │ │ ││
|
||||||
|
││=> │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ │ │ ││
|
||||||
|
││ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ││
|
||||||
|
│╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │
|
||||||
|
│=> Hardcover 9780756404079 B0043RSJ9S DAW Books 288 2023-05-20 🏷 │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭───────────────── Automatic Book Search ─────────────────╮ │
|
||||||
|
│ │Do you want to trigger an automatic search of your indexers│ │
|
||||||
|
│ │ for the book: Test Book? │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │╭────────────────────────────╮╭───────────────────────────╮│ │
|
||||||
|
│ ││ Yes ││ No ││ │
|
||||||
|
│ │╰────────────────────────────╯╰───────────────────────────╯│ │
|
||||||
|
│ ╰───────────────────────────────────────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Source Title ▼ Event Type Quality Date │
|
||||||
|
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭───────────────── Automatic Book Search ─────────────────╮ │
|
||||||
|
│ │Do you want to trigger an automatic search of your indexers│ │
|
||||||
|
│ │ for the book: Test Book? │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │╭────────────────────────────╮╭───────────────────────────╮│ │
|
||||||
|
│ ││ Yes ││ No ││ │
|
||||||
|
│ │╰────────────────────────────╯╰───────────────────────────╯│ │
|
||||||
|
│ ╰───────────────────────────────────────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Path Size Quality Media Info │
|
||||||
|
│=> /nfs/books/Test Author/Test Book.epub 3.30 GB EPUB MP3 - 2.0 - 128 kbps - 44100 - 16 │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭───────────────── Automatic Book Search ─────────────────╮ │
|
||||||
|
│ │Do you want to trigger an automatic search of your indexers│ │
|
||||||
|
│ │ for the book: Test Book? │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │╭────────────────────────────╮╭───────────────────────────╮│ │
|
||||||
|
│ ││ Yes ││ No ││ │
|
||||||
|
│ │╰────────────────────────────╯╰───────────────────────────╯│ │
|
||||||
|
│ ╰───────────────────────────────────────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Source ▼ Age ⛔ Title Indexer Size Peers Quality │
|
||||||
|
│=> torrent 1 days ⛔ Test Torrent Release kickass torrents 0.0 GB 2 / 1 EPUB │
|
||||||
|
│ usenet 1 days ⛔ Test Usenet Release DrunkenSlug 0.0 GB EPUB │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭───────────────── Automatic Book Search ─────────────────╮ │
|
||||||
|
│ │Do you want to trigger an automatic search of your indexers│ │
|
||||||
|
│ │ for the book: Test Book? │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │╭────────────────────────────╮╭───────────────────────────╮│ │
|
||||||
|
│ ││ Yes ││ No ││ │
|
||||||
|
│ │╰────────────────────────────╯╰───────────────────────────╯│ │
|
||||||
|
│ ╰───────────────────────────────────────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │
|
||||||
|
│=> Hardcover 9780756404079 B0043RSJ9S DAW Books 288 2023-05-20 🏷 │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Path Size Quality Media Info │
|
||||||
|
│=> /nfs/books/Test Author/Test Book.epub 3.30 GB EPUB MP3 - 2.0 - 128 kbps - 44100 - 16 │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Source Title ▼ Event Type Quality Date │
|
||||||
|
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭─────────────────────────────────── Details ───────────────────────────────────╮ │
|
||||||
|
│ │Source Title: Test Source Title │ │
|
||||||
|
│ │Event Type: grabbed │ │
|
||||||
|
│ │Quality: EPUB │ │
|
||||||
|
│ │Date: 2023-05-20 21:29:16 UTC │ │
|
||||||
|
│ │Indexer: │ │
|
||||||
|
│ │NZB Info URL: │ │
|
||||||
|
│ │Release Group: │ │
|
||||||
|
│ │Age: 0 days │ │
|
||||||
|
│ │Published Date: 1970-01-01 00:00:00 UTC │ │
|
||||||
|
│ │Download Client: │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ ╰─────────────────────────────────────────────────────────────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Source Title Event Type Quality Date │
|
||||||
|
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭─────────────────────────╮ │
|
||||||
|
│ │Something │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ ╰─────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Source Title ▼ Event Type Quality Date │
|
||||||
|
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │
|
||||||
|
│=> Hardcover 9780756404079 B0043RSJ9S DAW Books 288 2023-05-20 🏷 │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭─────────────────── Delete Book File ────────────────────╮ │
|
||||||
|
│ │ Do you really want to delete this book file: │ │
|
||||||
|
│ │ Test Book? │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │╭────────────────────────────╮╭───────────────────────────╮│ │
|
||||||
|
│ ││ Yes ││ No ││ │
|
||||||
|
│ │╰────────────────────────────╯╰───────────────────────────╯│ │
|
||||||
|
│ ╰───────────────────────────────────────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Path Size Quality Media Info │
|
||||||
|
│=> /nfs/books/Test Author/Test Book.epub 3.30 GB EPUB MP3 - 2.0 - 128 kbps - 44100 - 16 │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭─────────────────── Delete Book File ────────────────────╮ │
|
||||||
|
│ │ Do you really want to delete this book file: │ │
|
||||||
|
│ │ Test Book? │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │╭────────────────────────────╮╭───────────────────────────╮│ │
|
||||||
|
│ ││ Yes ││ No ││ │
|
||||||
|
│ │╰────────────────────────────╯╰───────────────────────────╯│ │
|
||||||
|
│ ╰───────────────────────────────────────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Source Title ▼ Event Type Quality Date │
|
||||||
|
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭─────────── Error ────────────╮ │
|
||||||
|
│ │ The given filter produced empty│ │
|
||||||
|
│ ╰────────────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Source Title ▼ Event Type Quality Date │
|
||||||
|
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭───────────── Filter ──────────────╮ │
|
||||||
|
│ │book history filter │ │
|
||||||
|
│ ╰─────────────────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Source ▼ Age ⛔ Title Indexer Size Peers Quality │
|
||||||
|
│=> torrent 1 days ⛔ Test Torrent Release kickass torrents 0.0 GB 2 / 1 EPUB │
|
||||||
|
│ usenet 1 days ⛔ Test Usenet Release DrunkenSlug 0.0 GB EPUB │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭───────────────── Download Rejected Release ──────────────────╮ │
|
||||||
|
│ │ Do you really want to download the rejected release: Test │ │
|
||||||
|
│ │ Torrent Release? │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │Rejection reasons: │ │
|
||||||
|
│ │• Unknown quality profile │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │╭──────────────────────────────╮╭──────────────────────────────╮│ │
|
||||||
|
│ ││ Yes ││ No ││ │
|
||||||
|
│ │╰──────────────────────────────╯╰──────────────────────────────╯│ │
|
||||||
|
│ ╰────────────────────────────────────────────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Source Age ⛔ Title Indexer Size Peers Quality │
|
||||||
|
│=> torrent 1 days ⛔ Test Torrent Release kickass torrents 0.0 GB 2 / 1 EPUB │
|
||||||
|
│ usenet 1 days ⛔ Test Usenet Release DrunkenSlug 0.0 GB EPUB │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭─────────────────────────╮ │
|
||||||
|
│ │Something │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ ╰─────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Source ▼ Age ⛔ Title Indexer Size Peers Quality │
|
||||||
|
│=> torrent 1 days ⛔ Test Torrent Release kickass torrents 0.0 GB 2 / 1 EPUB │
|
||||||
|
│ usenet 1 days ⛔ Test Usenet Release DrunkenSlug 0.0 GB EPUB │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Source Title ▼ Event Type Quality Date │
|
||||||
|
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭─────────── Error ────────────╮ │
|
||||||
|
│ │ No items found matching search │ │
|
||||||
|
│ ╰────────────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Source Title ▼ Event Type Quality Date │
|
||||||
|
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭───────────── Search ──────────────╮ │
|
||||||
|
│ │book history search │ │
|
||||||
|
│ ╰─────────────────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │
|
||||||
|
│=> Hardcover 9780756404079 B0043RSJ9S DAW Books 288 2023-05-20 🏷 │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭─────────── Error ────────────╮ │
|
||||||
|
│ │ No items found matching search │ │
|
||||||
|
│ ╰────────────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │
|
||||||
|
│=> Hardcover 9780756404079 B0043RSJ9S DAW Books 288 2023-05-20 🏷 │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭───────────── Search ──────────────╮ │
|
||||||
|
│ │edition search │ │
|
||||||
|
│ ╰─────────────────────────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │
|
||||||
|
│=> Hardcover 9780756404079 B0043RSJ9S DAW Books 288 2023-05-20 🏷 │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │
|
||||||
|
│=> Paperback 9780756404741 B0043RSJ9S DAW Books 662 │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ Loading ... │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ Loading ... │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ Loading ... │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ Loading ... │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Editions │ History │ File │ Manual Search │
|
||||||
|
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ Loading ... │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
Reference in new issue
Block a user