feat: CLI support for searching for discography releases in Lidarr

This commit is contained in:
2026-01-15 11:39:34 -07:00
parent d7f0dd5950
commit 8dfa664a06
13 changed files with 445 additions and 10 deletions
+25
View File
@@ -464,6 +464,30 @@ impl Display for LidarrTaskName {
}
}
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
#[serde(default)]
pub struct LidarrRelease {
pub guid: String,
pub protocol: String,
#[serde(deserialize_with = "super::from_i64")]
pub age: i64,
pub title: HorizontallyScrollableText,
pub discography: bool,
pub artist_name: Option<String>,
pub album_title: Option<String>,
pub indexer: String,
#[serde(deserialize_with = "super::from_i64")]
pub indexer_id: i64,
#[serde(deserialize_with = "super::from_i64")]
pub size: i64,
pub rejected: bool,
pub rejections: Option<Vec<String>>,
pub seeders: Option<Number>,
pub leechers: Option<Number>,
pub quality: QualityWrapper,
}
impl From<LidarrSerdeable> for Serdeable {
fn from(value: LidarrSerdeable) -> Serdeable {
Serdeable::Lidarr(value)
@@ -489,6 +513,7 @@ serde_enum_from!(
MetadataProfiles(Vec<MetadataProfile>),
QualityProfiles(Vec<QualityProfile>),
QueueEvents(Vec<QueueEvent>),
Releases(Vec<LidarrRelease>),
RootFolders(Vec<RootFolder>),
SecurityConfig(SecurityConfig),
SystemStatus(SystemStatus),
+14 -2
View File
@@ -6,8 +6,8 @@ mod tests {
use crate::models::lidarr_models::{
AddArtistSearchResult, Album, DownloadRecord, DownloadStatus, DownloadsResponse,
LidarrHistoryEventType, LidarrHistoryItem, LidarrHistoryWrapper, LidarrTask, Member,
MetadataProfile, MonitorType, NewItemMonitorType, SystemStatus,
LidarrHistoryEventType, LidarrHistoryItem, LidarrHistoryWrapper, LidarrRelease, LidarrTask,
Member, MetadataProfile, MonitorType, NewItemMonitorType, SystemStatus,
};
use crate::models::servarr_models::{
DiskSpace, HostConfig, Indexer, IndexerSettings, IndexerTestResult, Log, LogResponse,
@@ -460,6 +460,18 @@ mod tests {
assert_eq!(lidarr_serdeable, LidarrSerdeable::RootFolders(root_folders));
}
#[test]
fn test_lidarr_serdeable_from_releases() {
let releases = vec![LidarrRelease {
guid: "test".to_owned(),
..LidarrRelease::default()
}];
let lidarr_serdeable: LidarrSerdeable = releases.clone().into();
assert_eq!(lidarr_serdeable, LidarrSerdeable::Releases(releases));
}
#[test]
fn test_lidarr_serdeable_from_security_config() {
let security_config = SecurityConfig {
+13 -1
View File
@@ -8,7 +8,7 @@ use crate::app::context_clues::{
use crate::app::lidarr::lidarr_context_clues::{
ARTIST_DETAILS_CONTEXT_CLUES, ARTIST_HISTORY_CONTEXT_CLUES, ARTISTS_CONTEXT_CLUES,
};
use crate::models::lidarr_models::LidarrTask;
use crate::models::lidarr_models::{LidarrRelease, LidarrTask};
use crate::models::servarr_data::modals::EditIndexerModal;
use crate::models::servarr_models::{IndexerSettings, QueueEvent};
use crate::models::stateful_list::StatefulList;
@@ -35,6 +35,9 @@ use {
metadata_profile, metadata_profile_map, quality_profile, root_folder, tags_map,
},
crate::network::lidarr_network::lidarr_network_test_utils::test_utils::{log_line, task},
crate::network::lidarr_network::lidarr_network_test_utils::test_utils::{
torrent_release, usenet_release,
},
crate::network::servarr_test_utils::diskspace,
crate::network::servarr_test_utils::indexer_test_result,
crate::network::servarr_test_utils::queued_event,
@@ -58,6 +61,7 @@ pub struct LidarrData<'a> {
pub artist_info_tabs: TabState,
pub artists: StatefulTable<Artist>,
pub delete_files: bool,
pub discography_releases: StatefulTable<LidarrRelease>,
pub disk_space_vec: Vec<DiskSpace>,
pub downloads: StatefulTable<DownloadRecord>,
pub edit_artist_modal: Option<EditArtistModal>,
@@ -92,6 +96,7 @@ impl LidarrData<'_> {
pub fn reset_artist_info_tabs(&mut self) {
self.albums = StatefulTable::default();
self.discography_releases = StatefulTable::default();
self.artist_history = None;
self.artist_info_tabs.index = 0;
}
@@ -140,6 +145,7 @@ impl<'a> Default for LidarrData<'a> {
artist_history: None,
artists: StatefulTable::default(),
delete_files: false,
discography_releases: StatefulTable::default(),
disk_space_vec: Vec::new(),
downloads: StatefulTable::default(),
edit_artist_modal: None,
@@ -333,6 +339,12 @@ impl LidarrData<'_> {
}]);
lidarr_data.history.search = Some("test search".into());
lidarr_data.history.filter = Some("test filter".into());
lidarr_data
.discography_releases
.set_items(vec![torrent_release(), usenet_release()]);
lidarr_data
.discography_releases
.sorting(vec![sort_option!(indexer_id)]);
lidarr_data.root_folders.set_items(vec![root_folder()]);
lidarr_data.indexers.set_items(vec![indexer()]);
lidarr_data.queued_events.set_items(vec![queued_event()]);
@@ -7,7 +7,7 @@ mod tests {
use crate::app::lidarr::lidarr_context_clues::{
ARTIST_DETAILS_CONTEXT_CLUES, ARTIST_HISTORY_CONTEXT_CLUES, ARTISTS_CONTEXT_CLUES,
};
use crate::models::lidarr_models::Album;
use crate::models::lidarr_models::{Album, LidarrRelease};
use crate::models::servarr_data::lidarr::lidarr_data::{
ADD_ARTIST_BLOCKS, ADD_ARTIST_SELECTION_BLOCKS, ADD_ROOT_FOLDER_BLOCKS, ARTIST_DETAILS_BLOCKS,
DELETE_ALBUM_BLOCKS, DELETE_ALBUM_SELECTION_BLOCKS, DELETE_ARTIST_BLOCKS,
@@ -60,12 +60,16 @@ mod tests {
fn test_reset_artist_info_tabs() {
let mut lidarr_data = LidarrData::default();
lidarr_data.albums.set_items(vec![Album::default()]);
lidarr_data
.discography_releases
.set_items(vec![LidarrRelease::default()]);
lidarr_data.artist_history = Some(StatefulTable::default());
lidarr_data.artist_info_tabs.index = 1;
lidarr_data.reset_artist_info_tabs();
assert_is_empty!(lidarr_data.albums);
assert_is_empty!(lidarr_data.discography_releases);
assert_none!(lidarr_data.artist_history);
assert_eq!(lidarr_data.artist_info_tabs.index, 0);
}
@@ -146,6 +150,7 @@ mod tests {
assert_is_empty!(lidarr_data.downloads);
assert_none!(lidarr_data.edit_artist_modal);
assert_none!(lidarr_data.add_root_folder_modal);
assert_is_empty!(lidarr_data.discography_releases);
assert_is_empty!(lidarr_data.history);
assert_is_empty!(lidarr_data.logs);
assert_is_empty!(lidarr_data.log_details);