1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use crate::{
    CanMakeRequests, HasBaseUrl, InternalHttpApi, PlexApiError, Result, Server,
    SettingsMediaContainer, SettingsMediaContainerOuter,
};
use url::Url;

const SETTINGS_URL: &str = ":/prefs";

impl Server {
    pub async fn get_settings(&self) -> Result<SettingsMediaContainer> {
        let response = self.get(SETTINGS_URL).await?;
        if response.status() == reqwest::StatusCode::OK {
            Ok(SettingsMediaContainer::from(
                response.json::<SettingsMediaContainerOuter>().await?,
            ))
        } else {
            Err(PlexApiError::UnexpectedApiResponse(response.text().await?))
        }
    }

    pub async fn update_settings(&self, settings: &SettingsMediaContainer) -> Result<()> {
        let changed = settings.get_changed();
        if changed.is_empty() {
            Err(PlexApiError::NoChangedSettingsFound)
        } else {
            let mut uri = Url::parse(&(self.get_base_url().to_owned() + SETTINGS_URL)).unwrap();

            {
                let mut pairs = uri.query_pairs_mut();

                for (key, s) in changed {
                    pairs.append_pair(key, &s.get_value().to_string());
                }
            }

            let response = self
                .prepare_query(uri, reqwest::Method::PUT)?
                .send()
                .await?;

            if response.status() == 200 {
                Ok(())
            } else {
                Err(PlexApiError::UnexpectedApiResponse(response.text().await?))
            }
        }
    }
}