Skip to main content

ncm_api_rs/api/
cloud_upload_token.rs

1use super::Query;
2use crate::error::Result;
3/// 云盘上传 Token
4/// 对应 Node.js module/cloud_upload_token.js
5use crate::request::{ApiClient, ApiResponse, CryptoType};
6use serde_json::json;
7
8impl ApiClient {
9    /// 获取云盘上传 Token 及上传地址
10    /// 对应 /cloud/upload/token
11    ///
12    /// 此方法执行上传检查和 token 分配两步。
13    /// 完整的上传流程(包括 LBS 查询)需要调用方自行处理。
14    pub async fn cloud_upload_token_check(&self, query: &Query) -> Result<ApiResponse> {
15        let bitrate = query.get_or("bitrate", "999000");
16        let data = json!({
17            "bitrate": &bitrate,
18            "ext": "",
19            "length": query.get_or("fileSize", "0").parse::<i64>().unwrap_or(0),
20            "md5": query.get_or("md5", ""),
21            "songId": "0",
22            "version": 1
23        });
24        self.request(
25            "/api/cloud/upload/check",
26            data,
27            query.to_option(CryptoType::default()),
28        )
29        .await
30    }
31
32    /// 分配 NOS 上传 Token
33    /// 对应 /cloud/upload/token(token 分配步骤)
34    pub async fn cloud_upload_token_alloc(&self, query: &Query) -> Result<ApiResponse> {
35        let filename = query.get_or("filename", "");
36        let ext = if filename.contains('.') {
37            filename.rsplit('.').next().unwrap_or("mp3").to_string()
38        } else {
39            "mp3".to_string()
40        };
41        let clean_name = filename
42            .rsplit_once('.')
43            .map(|(name, _)| name)
44            .unwrap_or(&filename)
45            .replace(' ', "")
46            .replace('.', "_");
47        let data = json!({
48            "bucket": "jd-musicrep-privatecloud-audio-public",
49            "ext": ext,
50            "filename": clean_name,
51            "local": false,
52            "nos_product": 3,
53            "type": "audio",
54            "md5": query.get_or("md5", "")
55        });
56        self.request(
57            "/api/nos/token/alloc",
58            data,
59            query.to_option(CryptoType::Weapi),
60        )
61        .await
62    }
63}