use std::sync::LazyLock;
use rand::Rng;
use regex::Regex;
use serde_json::{Value, json};
use crate::providers::web::base_api;
const USER_AGENT: &str = "Mozilla/5.0 (Linux; Android 9; PCT-AL10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.64 HuaweiBrowser/10.0.3.311 Mobile Safari/537.36";
const REFERER: &str = "https://music.163.com/";
static EAPI_URL_RE: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"\w*api").unwrap());
pub(super) async fn post(url: &str, data: Value) -> Option<String> {
let Value::Object(mut data) = data else {
return None;
};
let header = request_header();
let cookie = header
.as_object()?
.iter()
.map(|(key, value)| format!("{key}={}", value.as_str().unwrap_or_default()))
.collect::<Vec<_>>()
.join("; ");
data.insert(
"header".to_string(),
Value::String(serde_json::to_string(&header).ok()?),
);
let params = lyrics_crypto::decrypter::netease::eapi::encrypt_params(
url,
&serde_json::to_string(&data).ok()?,
);
base_api::post_form_raw_with_headers(
&EAPI_URL_RE.replace(url, "eapi"),
&[("params", params.as_str())],
&[
("User-Agent", USER_AGENT),
("Referer", REFERER),
("Cookie", cookie.as_str()),
],
)
.await
}
fn request_header() -> Value {
json!({
"__csrf": "",
"appver": "8.0.0",
"buildver": base_api::unix_seconds().to_string(),
"channel": "",
"deviceId": "",
"mobilename": "",
"resolution": "1920x1080",
"os": "android",
"osver": "",
"requestId": format!("{}_{:04}", base_api::unix_millis(), rand::rng().random_range(0..1000u32)),
"versioncode": "140",
"MUSIC_U": "",
})
}