feat: Lidarr CLI support for downloading a release

This commit is contained in:
2026-01-15 12:57:54 -07:00
parent 0ee275d58f
commit c6dc8f6090
8 changed files with 212 additions and 13 deletions
@@ -0,0 +1,34 @@
#[cfg(test)]
mod tests {
use crate::models::lidarr_models::LidarrReleaseDownloadBody;
use crate::network::lidarr_network::LidarrEvent;
use crate::network::network_tests::test_utils::{MockServarrApi, test_network};
use serde_json::json;
#[tokio::test]
async fn test_handle_download_lidarr_release_event_uses_provided_params() {
let params = LidarrReleaseDownloadBody {
guid: "1234".to_owned(),
indexer_id: 2,
};
let (mock, app, _server) = MockServarrApi::post()
.with_request_body(json!({
"guid": "1234",
"indexerId": 2,
}))
.returns(json!({}))
.build_for(LidarrEvent::DownloadRelease(params.clone()))
.await;
app.lock().await.server_tabs.set_index(2);
let mut network = test_network(&app);
let result = network
.handle_lidarr_event(LidarrEvent::DownloadRelease(params))
.await;
mock.assert_async().await;
assert_ok!(result);
}
}
+35
View File
@@ -1,2 +1,37 @@
use crate::models::lidarr_models::LidarrReleaseDownloadBody;
use crate::network::lidarr_network::LidarrEvent;
use crate::network::{Network, RequestMethod};
use anyhow::Result;
use log::info;
use serde_json::Value;
mod albums;
mod artists;
#[cfg(test)]
#[path = "lidarr_library_network_tests.rs"]
mod lidarr_library_network_tests;
impl Network<'_, '_> {
pub(in crate::network::lidarr_network) async fn download_lidarr_release(
&mut self,
lidarr_release_download_body: LidarrReleaseDownloadBody,
) -> Result<Value> {
let event = LidarrEvent::DownloadRelease(LidarrReleaseDownloadBody::default());
info!("Downloading Lidarr release with params: {lidarr_release_download_body:?}");
let request_props = self
.request_props_from(
event,
RequestMethod::Post,
Some(lidarr_release_download_body),
None,
None,
)
.await;
self
.handle_request::<LidarrReleaseDownloadBody, Value>(request_props, |_, _| ())
.await
}
}
@@ -125,7 +125,13 @@ mod tests {
}
#[rstest]
fn test_resource_release(#[values(LidarrEvent::GetDiscographyReleases(0))] event: LidarrEvent) {
fn test_resource_release(
#[values(
LidarrEvent::GetDiscographyReleases(0),
LidarrEvent::DownloadRelease(Default::default())
)]
event: LidarrEvent,
) {
assert_str_eq!(event.resource(), "/release");
}
+8 -3
View File
@@ -3,8 +3,8 @@ use log::info;
use super::{NetworkEvent, NetworkResource};
use crate::models::lidarr_models::{
AddArtistBody, AddLidarrRootFolderBody, DeleteParams, EditArtistParams, LidarrSerdeable,
LidarrTaskName, MetadataProfile,
AddArtistBody, AddLidarrRootFolderBody, DeleteParams, EditArtistParams,
LidarrReleaseDownloadBody, LidarrSerdeable, LidarrTaskName, MetadataProfile,
};
use crate::models::servarr_models::{EditIndexerParams, IndexerSettings, QualityProfile, Tag};
use crate::network::{Network, RequestMethod};
@@ -35,6 +35,7 @@ pub enum LidarrEvent {
DeleteIndexer(i64),
DeleteRootFolder(i64),
DeleteTag(i64),
DownloadRelease(LidarrReleaseDownloadBody),
EditArtist(EditArtistParams),
EditAllIndexerSettings(IndexerSettings),
EditIndexer(EditIndexerParams),
@@ -97,7 +98,7 @@ impl NetworkResource for LidarrEvent {
LidarrEvent::GetDownloads(_) | LidarrEvent::DeleteDownload(_) => "/queue",
LidarrEvent::GetHistory(_) => "/history",
LidarrEvent::MarkHistoryItemAsFailed(_) => "/history/failed",
LidarrEvent::GetDiscographyReleases(_) => "/release",
LidarrEvent::GetDiscographyReleases(_) | LidarrEvent::DownloadRelease(_) => "/release",
LidarrEvent::GetHostConfig | LidarrEvent::GetSecurityConfig => "/config/host",
LidarrEvent::GetIndexers | LidarrEvent::DeleteIndexer(_) | LidarrEvent::EditIndexer(_) => {
"/indexer"
@@ -171,6 +172,10 @@ impl Network<'_, '_> {
.delete_lidarr_tag(tag_id)
.await
.map(LidarrSerdeable::from),
LidarrEvent::DownloadRelease(lidarr_release_download_body) => self
.download_lidarr_release(lidarr_release_download_body)
.await
.map(LidarrSerdeable::from),
LidarrEvent::GetAlbums(artist_id) => {
self.get_albums(artist_id).await.map(LidarrSerdeable::from)
}