Merge branch 'master' into rocket
This commit is contained in:
commit
0cd82a338d
4 changed files with 174 additions and 515 deletions
613
Cargo.lock
generated
613
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -17,10 +17,9 @@ error-chain = "0.12.0"
|
||||||
getopts = "0.2.15"
|
getopts = "0.2.15"
|
||||||
id3 = "0.2.3"
|
id3 = "0.2.3"
|
||||||
image = "0.20.0"
|
image = "0.20.0"
|
||||||
rustfm-scrobble = "0.9.1"
|
rustfm-scrobble = { git = "https://github.com/agersant/rustfm-scrobble" }
|
||||||
lewton = "0.9.1"
|
lewton = "0.9.1"
|
||||||
log = "0.4.5"
|
log = "0.4.5"
|
||||||
md5 = "0.5.0"
|
|
||||||
metaflac = "0.1.8"
|
metaflac = "0.1.8"
|
||||||
mp3-duration = "0.1.0"
|
mp3-duration = "0.1.0"
|
||||||
rand = "0.5.5"
|
rand = "0.5.5"
|
||||||
|
@ -32,7 +31,6 @@ rust-crypto = "0.2.36"
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
serde-xml-rs = "0.2.1"
|
|
||||||
simplelog = "0.5.2"
|
simplelog = "0.5.2"
|
||||||
toml = "0.4.5"
|
toml = "0.4.5"
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,4 @@
|
||||||
use md5;
|
|
||||||
use reqwest;
|
|
||||||
use rustfm_scrobble::{Scrobble, Scrobbler};
|
use rustfm_scrobble::{Scrobble, Scrobbler};
|
||||||
use serde_xml_rs::deserialize;
|
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::io::Read;
|
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use crate::db::ConnectionSource;
|
use crate::db::ConnectionSource;
|
||||||
|
@ -14,7 +9,6 @@ use crate::vfs::VFSSource;
|
||||||
|
|
||||||
const LASTFM_API_KEY: &str = "02b96c939a2b451c31dfd67add1f696e";
|
const LASTFM_API_KEY: &str = "02b96c939a2b451c31dfd67add1f696e";
|
||||||
const LASTFM_API_SECRET: &str = "0f25a80ceef4b470b5cb97d99d4b3420";
|
const LASTFM_API_SECRET: &str = "0f25a80ceef4b470b5cb97d99d4b3420";
|
||||||
const LASTFM_API_ROOT: &str = "http://ws.audioscrobbler.com/2.0/";
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
struct AuthResponseSessionName {
|
struct AuthResponseSessionName {
|
||||||
|
@ -63,30 +57,14 @@ pub fn link<T>(db: &T, username: &str, token: &str) -> Result<(), errors::Error>
|
||||||
where
|
where
|
||||||
T: ConnectionSource + VFSSource,
|
T: ConnectionSource + VFSSource,
|
||||||
{
|
{
|
||||||
let mut params = HashMap::new();
|
let mut scrobbler = Scrobbler::new(LASTFM_API_KEY.into(), LASTFM_API_SECRET.into());
|
||||||
params.insert("token".to_string(), token.to_string());
|
let auth_response = scrobbler.authenticate_with_token(token.to_string())?;
|
||||||
params.insert("api_key".to_string(), LASTFM_API_KEY.to_string());
|
|
||||||
let mut response = match api_request("auth.getSession", ¶ms) {
|
|
||||||
Ok(r) => r,
|
|
||||||
Err(_) => bail!(errors::ErrorKind::LastFMAuthError),
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut body = String::new();
|
|
||||||
response.read_to_string(&mut body)?;
|
|
||||||
if !response.status().is_success() {
|
|
||||||
bail!(errors::ErrorKind::LastFMAuthError)
|
|
||||||
}
|
|
||||||
|
|
||||||
let auth_response: AuthResponse = match deserialize(body.as_bytes()) {
|
|
||||||
Ok(d) => d,
|
|
||||||
Err(_) => bail!(errors::ErrorKind::LastFMDeserializationError),
|
|
||||||
};
|
|
||||||
|
|
||||||
user::lastfm_link(
|
user::lastfm_link(
|
||||||
db,
|
db,
|
||||||
username,
|
username,
|
||||||
&auth_response.session.name.body,
|
&auth_response.name,
|
||||||
&auth_response.session.key.body,
|
&auth_response.key,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,43 +98,3 @@ where
|
||||||
scrobbler.now_playing(scrobble)?;
|
scrobbler.now_playing(scrobble)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn api_request(
|
|
||||||
method: &str,
|
|
||||||
params: &HashMap<String, String>,
|
|
||||||
) -> Result<reqwest::Response, reqwest::Error> {
|
|
||||||
let mut url = LASTFM_API_ROOT.to_string();
|
|
||||||
url.push_str("?");
|
|
||||||
|
|
||||||
url.push_str(&format!("method={}&", method));
|
|
||||||
for (k, v) in params.iter() {
|
|
||||||
url.push_str(&format!("{}={}&", k, v));
|
|
||||||
}
|
|
||||||
let api_signature = get_signature(method, params);
|
|
||||||
url.push_str(&format!("api_sig={}", api_signature));
|
|
||||||
|
|
||||||
let client = reqwest::ClientBuilder::new().build()?;
|
|
||||||
let request = client.get(url.as_str());
|
|
||||||
request.send()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_signature(method: &str, params: &HashMap<String, String>) -> String {
|
|
||||||
let mut signature_data = params.clone();
|
|
||||||
signature_data.insert("method".to_string(), method.to_string());
|
|
||||||
|
|
||||||
let mut param_names = Vec::new();
|
|
||||||
for param_name in signature_data.keys() {
|
|
||||||
param_names.push(param_name);
|
|
||||||
}
|
|
||||||
param_names.sort();
|
|
||||||
|
|
||||||
let mut signature = String::new();
|
|
||||||
for param_name in param_names {
|
|
||||||
signature.push_str((param_name.to_string() + signature_data[param_name].as_str()).as_str())
|
|
||||||
}
|
|
||||||
|
|
||||||
signature.push_str(LASTFM_API_SECRET);
|
|
||||||
|
|
||||||
let digest = md5::compute(signature.as_bytes());
|
|
||||||
format!("{:X}", digest)
|
|
||||||
}
|
|
||||||
|
|
|
@ -17,7 +17,6 @@ extern crate getopts;
|
||||||
extern crate id3;
|
extern crate id3;
|
||||||
extern crate image;
|
extern crate image;
|
||||||
extern crate lewton;
|
extern crate lewton;
|
||||||
extern crate md5;
|
|
||||||
extern crate metaflac;
|
extern crate metaflac;
|
||||||
extern crate mp3_duration;
|
extern crate mp3_duration;
|
||||||
extern crate rand;
|
extern crate rand;
|
||||||
|
@ -32,7 +31,6 @@ extern crate serde;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
extern crate serde_json;
|
extern crate serde_json;
|
||||||
extern crate serde_xml_rs;
|
|
||||||
extern crate toml;
|
extern crate toml;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate log;
|
extern crate log;
|
||||||
|
|
Loading…
Add table
Reference in a new issue