Initial commit

This commit is contained in:
2026-01-11 10:31:39 +08:00
commit bcb54bd290
8 changed files with 3438 additions and 0 deletions

3
config/default.json Normal file
View File

@@ -0,0 +1,3 @@
{
"OOBE":false
}

3
config/development.json Normal file
View File

@@ -0,0 +1,3 @@
{
"OOBE":false
}

21
package.json Normal file
View File

@@ -0,0 +1,21 @@
{
"name": "couldmusic",
"version": "1.0.0",
"description": "",
"main": "index.js",
"type": "module",
"scripts": {
"dev": "export NODE_ENV=development&pnpm run build&node dist/index.js",
"build": "tsc"
},
"dependencies": {
"@inquirer/prompts": "^8.1.0",
"@neteasecloudmusicapienhanced/api": "^4.29.20",
"@types/config": "^3.3.5",
"NeteaseCloudMusicApi": "^4.28.0",
"chalk": "^5.6.2",
"config": "^4.1.1",
"webpack": "^5.104.1",
"webpack-cli": "^6.0.1"
}
}

3240
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

90
src/backends/163.ts Normal file
View File

@@ -0,0 +1,90 @@
import neteaseApi from '@neteasecloudmusicapienhanced/api'
import { select, input, password } from '@inquirer/prompts'
import config from 'config'
const { login_cellphone, captcha_sent, captcha_verify } = neteaseApi;
class CouldMusic {
private cookie: string[]
private loginMode: string
constructor() {
this.cookie = [];
this.loginMode = ""
}
public async login() {
this.loginMode = await select({
message: "选择一个登入方式",
choices: [
{
name: "手机号登入",
value: "phone",
description: "使用手机号登入"
},
{
name: "扫码登入",
value: "qrCode",
description: "使用二维码"
},
{
name: "邮箱登入",
value: "email",
disabled: true
},
]
})
switch (this.loginMode) {
case "phone":
var authMode = await select({
message: "验证码or密码",
choices: [
{
name: "验证码",
value: "captcha",
description: "使用验证码登入"
},
{
name: "密码",
value: "passwd",
description: "使用验证码登入"
},
]
})
if (authMode == "passwd") {
var phoneid = await input({
message: "请输入手机号"
})
var passwd = await password({
message: "请输入密码"
})
var result = await login_cellphone({
phone: phoneid,
password: encodeURIComponent(passwd)
})
if (result.body.code == 400) {
console.error("❌账号或密码错误!")
}
}else if(authMode=="captcha"){
var phoneid = await input({
message: "请输入手机号"
})
captcha_sent({
phone:phoneid
})
var verifyCode = await input({
message: "请输入验证码"
})
try{
var result=await login_cellphone({
phone:phoneid,
captcha:verifyCode
})
}finally{
console.error("❌验证码错误!")
}
this.cookie=result.cookie
}
}
}
}
export default CouldMusic;

9
src/index.ts Normal file
View File

@@ -0,0 +1,9 @@
import chalk from 'chalk'
import config from 'config'
import oobe from './oobe.js'
console.info(chalk.bgBlueBright("> ChloudMusic b0.1 "))
console.info(chalk.bgBlueBright("> Read Configuration"))
var isOobe=config.get("OOBE")
if(!isOobe){
oobe()
}

28
src/oobe.ts Normal file
View File

@@ -0,0 +1,28 @@
import { select, input } from '@inquirer/prompts'
import CloudMusic from './backends/163.js'
async function oobe() {
const backends = await select({
message: "选择一个音乐服务商",
choices: [
{
name: "163CloudMusic",
value: "163",
description: "网易云音乐"
},
{
name: "spotify",
value: "spotify",
description: "Spotify"
}
]
})
switch (backends) {
case "163":
var backend=new CloudMusic()
backend.login()
break;
case "spotify": break;
}
}
export default oobe

44
tsconfig.json Normal file
View File

@@ -0,0 +1,44 @@
{
// Visit https://aka.ms/tsconfig to read more about this file
"compilerOptions": {
// File Layout
// "rootDir": "./src",
"outDir": "./dist",
// Environment Settings
// See also https://aka.ms/tsconfig/module
"module": "nodenext",
"target": "esnext",
"types": [],
// For nodejs:
// "lib": ["esnext"],
// "types": ["node"],
// and npm install -D @types/node
// Other Outputs
"sourceMap": true,
"declaration": true,
"declarationMap": true,
// Stricter Typechecking Options
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true,
// Style Options
// "noImplicitReturns": true,
// "noImplicitOverride": true,
// "noUnusedLocals": true,
// "noUnusedParameters": true,
// "noFallthroughCasesInSwitch": true,
// "noPropertyAccessFromIndexSignature": true,
// Recommended Options
"strict": true,
"jsx": "react-jsx",
"verbatimModuleSyntax": true,
"isolatedModules": true,
"noUncheckedSideEffectImports": true,
"moduleDetection": "force",
"skipLibCheck": true,
}
}