sagarithm/jiosaavn
GitHub: sagarithm/jiosaavn
一个逆向工程的 JioSaavn 音乐流媒体 TypeScript 客户端库,提供歌曲搜索、元数据获取和音频流解密能力。
Stars: 1 | Forks: 0
# JioSaavn API 逆向工程与客户端规范
一个开源的、逆向工程的客户端规范和库实现,用于内部的 JioSaavn 音乐流媒体 API。本仓库提供了文档、schema 以及一个独立且可直接发布的 TypeScript 客户端,用于获取歌曲、专辑、艺术家、播放列表、歌词,并解密高质量音频流。
## 📦 安装
使用你偏好的包管理器安装打包好的库:
```
npm install jiosaavn
# 或
yarn add jiosaavn
# 或
pnpm add jiosaavn
# 或
bun add jiosaavn
```
## 🚀 快速开始
该包同时支持 ES Modules (`import`) 和 CommonJS (`require`),并编译带有高保真类型声明 (`.d.ts`)。
### 1. 导入客户端
**ES Modules (TypeScript / 现代 JavaScript)**
```
import { JioSaavnAPI } from 'jiosaavn';
const api = new JioSaavnAPI();
```
**CommonJS (Node.js)**
```
const { JioSaavnAPI } = require('jiosaavn');
const api = new JioSaavnAPI();
```
### 2. 客户端初始化 (浏览器 CORS 代理)
由于原始的 JioSaavn API endpoint 会阻止来自 Web 浏览器的 CORS 请求,你应当在实例化时向客户端传递你自己的反向代理 URL(CORS 代理)。如果任何 endpoint 失败,客户端会处理自动故障转移并在代理列表中进行轮询。
```
const api = new JioSaavnAPI([
'/api-saavn', // Local proxy path
'https://yourproxy.com/api-saavn' // Remote fallback proxy
]);
```
### 3. 获取详情示例
```
// Fetch details of a specific song
const songs = await api.getSongById('sSongId123');
console.log(songs[0].name);
// Decrypt high-quality audio streams
const encryptedUrl = songs[0].downloadUrl[4].url; // 320kbps stream
```
## 🔑 音频流解密算法
JioSaavn 使用 **DES (Data Encryption Standard)** 密码的 **ECB (Electronic Codebook)** 模式,将其媒体 URL 封装在加密字符串(`encrypted_media_url` 或 `media_url` 参数)中。
### 加密参数
- **算法**:DES-ECB
- **密钥**:`38346591`
- **初始化向量 (IV)**:`00000000`(在 ECB 模式中未使用,但在空块回退时必需)
- **格式编码**:Base64 编码
### 使用客户端解密媒体流
该库暴露了一个静态的高性能方法 `decryptUrl`,无需设置自定义密码即可轻松解密这些值:
```
import { JioSaavnAPI } from 'jiosaavn';
const encryptedMediaUrl = 'base64_encrypted_string_from_api';
const directAudioUrl = JioSaavnAPI.decryptUrl(encryptedMediaUrl);
console.log(directAudioUrl);
// Returns: "https://aac.saavncdn.com/999/some_hash_320.mp4"
```
解密后,你可以替换 URL 中的比特率后缀(例如 `_160`)以获取不同音质的音频流:
- `_12` 表示 **12 kbps**
- `_48` 表示 **48 kbps**
- `_96` 表示 **96 kbps**
- `_160` 表示 **160 kbps**
- `_320` 表示 **320 kbps**(高质量流)
## 🛰 核心 API 规范
JioSaavn 客户端 API 调用的基础 endpoint 为:
`https://www.jiosaavn.com/api.php`
所有请求均为 `GET` 请求,并应指定以下基础查询参数:
- `_format`: `json`
- `_marker`: `0`
- `ctx`: `web6dot0`
- `api_version`: `4`
### Endpoint (`__call` 参数)
#### 1. 全局自动补全搜索
- **Endpoint**:`autocomplete.get`
- **参数**:
- `query`:搜索词 (string)
- **响应**:扁平的分类对象,包含 `songs`、`albums`、`artists`、`playlists` 和 `topQuery` 数组。
#### 2. 歌曲搜索
- **Endpoint**:`search.getResults`
- **参数**:
- `q`:搜索查询 (string)
- `n`:限制/数量 (number)
- `p`:页码 (从 1 开始索引)
#### 3. 获取歌曲详情
- **Endpoint**:`song.getDetails`
- **参数**:
- `pids`:以逗号分隔的歌曲 ID 列表 (string)
#### 4. 获取专辑详情
- **Endpoint**:`content.getAlbumDetails`
- **参数**:
- `albumid`:专辑 ID (string)
#### 5. 获取艺术家详情
- **Endpoint**:`artist.getArtistPageDetails`
- **参数**:
- `artistId`:艺术家 ID (string)
#### 6. 获取播放列表详情
- **Endpoint**:`playlist.getDetails`
- **参数**:
- `listid`:播放列表 ID (string)
#### 7. 获取歌词
- **Endpoint**:`lyrics.get`
- **参数**:
- `lyrics_id`:歌曲 ID (string)
## 🛠 独立客户端的功能
- **零依赖**,除了用于加密的 `node-forge`。
- **强类型**:高度类型化的 schema 模型和响应。
- **故障转移保护**:跨多个代理 endpoint 的轮询逻辑。
- **现代化构建**:开箱即用地支持 ESM、CJS 和 TypeScript 类型。
## ⚖ 许可证
基于 Apache License 2.0 授权。详情请参阅 [LICENSE](./LICENSE)。
标签:API客户端, GNU通用公共许可证, Node.js, TypeScript, 云资产清单, 安全插件, 流媒体, 自动化攻击, 逆向工程, 音频解密