aboutsummaryrefslogtreecommitdiff
path: root/src/utils/spotify.rs
blob: 5da9fead599cb3a3ad5ff4a64fd4ef0477e568f9 (plain)
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
49
50
51
52
53
54
55
56
57
58
59
use crate::config::CONFIG;
use crate::types::ThreadsData;
use dbus::blocking::stdintf::org_freedesktop_dbus::Properties;
use dbus::{arg, blocking::Connection};
use std::time::Duration;

// getting spotify current artist and title.
pub async fn get_spotify() -> ThreadsData {
    let empty_data = ThreadsData::Spotify(String::from(""));
    let conn = match Connection::new_session() {
        Ok(conn) => conn,
        _ => return empty_data,
    };

    let p = conn.with_proxy(
        "org.mpris.MediaPlayer2.spotify",
        "/org/mpris/MediaPlayer2",
        Duration::from_millis(5000),
    );

    let metadata: arg::PropMap = match p.get("org.mpris.MediaPlayer2.Player", "Metadata") {
        Ok(data) => data,
        _ => return empty_data,
    };

    let title: Option<&String> = arg::prop_cast(&metadata, "xesam:title");
    let artist: Option<&Vec<String>> = arg::prop_cast(&metadata, "xesam:artist");

    let title = match title {
        Some(title) => {
            if title.len() > 30 {
                &title[..30]
            } else {
                title.as_str()
            }
        }
        _ => "",
    };

    let artist = match artist {
        Some(artist_vec) => match artist_vec.first() {
            Some(name) => {
                if name.len() > 30 {
                    &name[..30]
                } else {
                    name.as_str()
                }
            }
            _ => "",
        },
        None => "",
    };

    let data = format!(
        "  {}  {} - {}  {}",
        CONFIG.spotify.icon, artist, title, CONFIG.seperator
    );
    ThreadsData::Spotify(data)
}