tetratto_core/database/connections/
last_fm.rs

1use std::collections::HashMap;
2use crate::{
3    config::Config,
4    model::auth::{ConnectionType, ExternalConnectionInfo, UserConnections},
5};
6use md5::{Md5, Digest};
7use base16ct::upper::encode_string;
8
9/// A connection to last.fm.
10pub struct LastFmConnection(pub UserConnections, pub Config);
11
12impl LastFmConnection {
13    /// Create a legacy MD5 signature, since last.fm is old.
14    pub fn signature(params: HashMap<String, String>, secret: String) -> String {
15        let mut params_string = String::new();
16
17        let mut params = params.clone();
18        params.remove("format");
19
20        let mut x = params.iter().collect::<Vec<(&String, &String)>>();
21        x.sort_by(|a, b| a.0.cmp(b.0));
22
23        for param in x {
24            params_string.push_str(&format!("{}{}", param.0, param.1));
25        }
26
27        let mut hasher = Md5::new();
28        hasher.update(format!("{params_string}{secret}"));
29
30        let hash = hasher.finalize();
31        encode_string(&hash)
32    }
33
34    /// Create a new [`ExternalConnectionInfo`] for the connection.
35    pub fn connection() -> ExternalConnectionInfo {
36        ExternalConnectionInfo {
37            con_type: ConnectionType::Token,
38            data: HashMap::new(),
39            show_on_profile: true,
40        }
41    }
42}