diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..03f2450 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,16 @@ +node_modules +npm-debug.log +Dockerfile* +docker-compose* +.dockerignore +.git +.github +.gitignore +README.md +LICENSE +.vscode +dist +dist_electron +build +images +script \ No newline at end of file diff --git a/.env.example b/.env.example index 36eb51b..7c0058a 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,7 @@ -VUE_APP_NETEASE_API_URL=http://127.0.0.1:3000 -VUE_APP_ELECTRON_API_URL=http://127.0.0.1:10754 -VUE_APP_ENABLE_SENTRY=false -DEV_SERVER_PORT=20201 \ No newline at end of file +VUE_APP_NETEASE_API_URL=/api +VUE_APP_ELECTRON_API_URL=/api +VUE_APP_ELECTRON_API_URL_DEV=http://127.0.0.1:10754 +VUE_APP_LASTFM_API_KEY=09c55292403d961aa517ff7f5e8a3d9c +VUE_APP_LASTFM_API_SHARED_SECRET=307c9fda32b3904e53654baff215cb67 +DEV_SERVER_PORT=20201 + diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..fd24c66 --- /dev/null +++ b/.envrc @@ -0,0 +1,4 @@ +source_url "https://raw.githubusercontent.com/cachix/devenv/82c0147677e510b247d8b9165c54f73d32dfd899/direnvrc" "sha256-7u4iDd1nZpxL4tCzmPG0dQgC5V+/44Ba+tHkPob1v2k=" + +export NIXPKGS_ALLOW_INSECURE=1 +use devenv diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..ac10488 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,7 @@ +* text eol=lf +# Denote all files that are truly binary and should not be modified. +*.png binary +*.jpg binary +*.mp3 binary +*.icns binary +*.gif binary diff --git a/.github/ISSUE_TEMPLATE/----------.md b/.github/ISSUE_TEMPLATE/----------.md new file mode 100644 index 0000000..ba42d00 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/----------.md @@ -0,0 +1,21 @@ +--- +name: 反馈问题或请求新功能 +about: bug & feature +title: '' +labels: '' +assignees: '' + +--- + +# 尽量每个 issue 只提一个 bug 或新功能 + +### 提新 issue 前请确认 👉 + +- 没人提过这个 issue([这里看所有 issue](https://github.com/qier222/YesPlayMusic/issues)) +- 项目的 Todo 里没有与你 issue 相关的内容([这里看 Todo](https://github.com/qier222/YesPlayMusic/projects/1)) + +### 反馈 bug 需要的信息 + +- 用的是网页版还是客户端 +- 浏览器名称或电脑操作系统 +- 控制台 Console 页面的截图(按 F12 可打开控制台) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..4caf481 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,116 @@ +name: Release + +env: + YARN_INSTALL_NOPT: yarn add --ignore-platform --ignore-optional + +on: + push: + branches: + - master + tags: + - v* + workflow_dispatch: + +jobs: + release: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [macos-latest, windows-latest, ubuntu-22.04] + + steps: + - name: Check out Git repository + uses: actions/checkout@v3 + with: + submodules: "recursive" + + - name: Install Node.js, NPM and Yarn + uses: actions/setup-node@v3 + with: + node-version: 16 + cache: 'yarn' + + - name: Install RPM & Pacman (on Ubuntu) + if: runner.os == 'Linux' + run: | + sudo apt-get update && + sudo apt-get install --no-install-recommends -y rpm && + sudo apt-get install --no-install-recommends -y libarchive-tools && + sudo apt-get install --no-install-recommends -y libopenjp2-tools + + - name: Install Snapcraft (on Ubuntu) + uses: samuelmeuli/action-snapcraft@v1 + if: startsWith(matrix.os, 'ubuntu') + with: + snapcraft_token: ${{ secrets.snapcraft_token }} + + - id: get_unm_version + name: Get the installed UNM version + run: | + yarn --ignore-optional + unm_version=$(node -e "console.log(require('./node_modules/@unblockneteasemusic/rust-napi/package.json').version)") + echo "::set-output name=unmver::${unm_version}" + shell: bash + + - name: Install UNM dependencies for Windows + if: runner.os == 'Windows' + run: | + ${{ env.YARN_INSTALL_NOPT }} \ + @unblockneteasemusic/rust-napi-win32-x64-msvc@${{steps.get_unm_version.outputs.unmver}} + shell: bash + + - name: Install UNM dependencies for macOS + if: runner.os == 'macOS' + run: | + ${{ env.YARN_INSTALL_NOPT }} \ + @unblockneteasemusic/rust-napi-darwin-x64@${{steps.get_unm_version.outputs.unmver}} \ + @unblockneteasemusic/rust-napi-darwin-arm64@${{steps.get_unm_version.outputs.unmver}} \ + dmg-license + shell: bash + + - name: Install UNM dependencies for Linux + if: runner.os == 'Linux' + run: | + ${{ env.YARN_INSTALL_NOPT }} \ + @unblockneteasemusic/rust-napi-linux-x64-gnu@${{steps.get_unm_version.outputs.unmver}} \ + @unblockneteasemusic/rust-napi-linux-arm64-gnu@${{steps.get_unm_version.outputs.unmver}} \ + @unblockneteasemusic/rust-napi-linux-arm-gnueabihf@${{steps.get_unm_version.outputs.unmver}} + shell: bash + + - name: Build/release Electron app + uses: samuelmeuli/action-electron-builder@v1.6.0 + env: + VUE_APP_NETEASE_API_URL: /api + VUE_APP_ELECTRON_API_URL: /api + VUE_APP_ELECTRON_API_URL_DEV: http://127.0.0.1:10754 + VUE_APP_LASTFM_API_KEY: 09c55292403d961aa517ff7f5e8a3d9c + VUE_APP_LASTFM_API_SHARED_SECRET: 307c9fda32b3904e53654baff215cb67 + with: + # GitHub token, automatically provided to the action + # (No need to define this secret in the repo settings) + github_token: ${{ secrets.github_token }} + + # If the commit is tagged with a version (e.g. "v1.0.0"), + # release the app after building + release: ${{ startsWith(github.ref, 'refs/tags/v') }} + + use_vue_cli: true + + - uses: actions/upload-artifact@v3 + with: + name: YesPlayMusic-mac + path: dist_electron/*-universal.dmg + if-no-files-found: ignore + + - uses: actions/upload-artifact@v3 + with: + name: YesPlayMusic-win + path: dist_electron/*Setup*.exe + if-no-files-found: ignore + + - uses: actions/upload-artifact@v3 + with: + name: YesPlayMusic-linux + path: dist_electron/*.AppImage + if-no-files-found: ignore diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml new file mode 100644 index 0000000..f8e0be8 --- /dev/null +++ b/.github/workflows/sync.yml @@ -0,0 +1,48 @@ +name: Upstream Sync + +permissions: + contents: write + issues: write + actions: write + +on: + schedule: + - cron: '0 * * * *' # every hour + workflow_dispatch: + +jobs: + sync_latest_from_upstream: + name: Sync latest commits from upstream repo + runs-on: ubuntu-latest + if: ${{ github.event.repository.fork }} + + steps: + - uses: actions/checkout@v4 + + - name: Clean issue notice + uses: actions-cool/issues-helper@v3 + with: + actions: 'close-issues' + labels: '🚨 Sync Fail' + + - name: Sync upstream changes + id: sync + uses: aormsby/Fork-Sync-With-Upstream-action@v3.4 + with: + upstream_sync_repo: qier222/YesPlayMusic + upstream_sync_branch: master + target_sync_branch: master + target_repo_token: ${{ secrets.GITHUB_TOKEN }} # automatically generated, no need to set + test_mode: false + + - name: Sync check + if: failure() + uses: actions-cool/issues-helper@v3 + with: + actions: 'create-issue' + title: '🚨 同步失败 | Sync Fail' + labels: '🚨 Sync Fail' + body: | + Due to a change in the workflow file of the upstream repository, GitHub has automatically suspended the scheduled automatic update. You need to manually sync your fork. + + 由于上游仓库的 workflow 文件变更,导致 GitHub 自动暂停了本次自动更新,你需要手动 Sync Fork 一次。 diff --git a/.gitignore b/.gitignore index 9ba8104..d8dd8fc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,6 @@ .DS_Store node_modules /dist -dist_electron - # local env files .env @@ -30,3 +28,16 @@ pnpm-debug.log* /dist_electron NeteaseCloudMusicApi-master NeteaseCloudMusicApi-master.zip + +# Local Netlify folder +.netlify +vercel.json +# Devenv +.devenv* +devenv.local.nix + +# direnv +.direnv + +# pre-commit +.pre-commit-config.yaml diff --git a/.npmrc b/.npmrc deleted file mode 100644 index adcf848..0000000 --- a/.npmrc +++ /dev/null @@ -1,4 +0,0 @@ -# 如果发现 npm / yarn 安装太慢,可以解除注释 -# registry=https://registry.npm.taobao.org/ -# ELECTRON_MIRROR=https://npm.taobao.org/mirrors/electron -# phantomjs_cdnurl=https://npm.taobao.org/dist/phantomjs \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..da2d398 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +14 \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index 15709e8..13859d2 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,3 @@ build coverage dist -netease_api - diff --git a/.prettierrc b/.prettierrc index 86f82d1..38800a3 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,10 +3,9 @@ "tabWidth": 2, "useTabs": false, "semi": true, - "singleQuote": false, + "singleQuote": true, "jsxSingleQuote": true, - "jsxBracketSameLine": false, - "arrowParens": "always", + "arrowParens": "avoid", "endOfLine": "lf", "bracketSpacing": true, "htmlWhitespaceSensitivity": "strict" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2fb8f95 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,25 @@ +FROM node:16.13.1-alpine as build +ENV VUE_APP_NETEASE_API_URL=/api +WORKDIR /app +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories &&\ + apk add --no-cache python3 make g++ git +COPY package.json yarn.lock ./ +RUN yarn install +COPY . . +RUN yarn config set electron_mirror https://npmmirror.com/mirrors/electron/ && \ + yarn build + +FROM nginx:1.20.2-alpine as app + +COPY --from=build /app/package.json /usr/local/lib/ + +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories &&\ + apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.14/main libuv \ + && apk add --no-cache --update-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.14/main nodejs npm \ + && npm i -g $(awk -F \" '{if($2=="NeteaseCloudMusicApi") print $2"@"$4}' /usr/local/lib/package.json) \ + && rm -f /usr/local/lib/package.json + +COPY --from=build /app/docker/nginx.conf.example /etc/nginx/conf.d/default.conf +COPY --from=build /app/dist /usr/share/nginx/html + +CMD nginx ; exec npx NeteaseCloudMusicApi \ No newline at end of file diff --git a/LICENSE b/LICENSE index d8911ac..7385fd2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020 qier222 +Copyright (c) 2020-2023 qier222 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/README.md b/README.md index f76ecfb..146f524 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- + Logo

YesPlayMusic

@@ -8,67 +8,221 @@

高颜值的第三方网易云播放器
- 🌎 访问DEMO  |   - 📦️ 下载安装包 + 🌎 访问DEMO  |   + 📦️ 下载安装包  |   + 💬 加入交流群

-[![Library][library-screenshot]](https://music.bluepill.one) +[![Library][library-screenshot]](https://music.ineko.cc) + + +## 全新版本 +全新2.0 Alpha测试版已发布,欢迎前往 [Releases](https://github.com/qier222/YesPlayMusic/releases) 页面下载。 +当前版本将会进入维护模式,除重大bug修复外,不会再更新新功能。 ## ✨ 特性 - ✅ 使用 Vue.js 全家桶开发 -- ⭐ 简洁美观的 UI -- 🔴 网易云账号登录 -- ⏭️ 支持 MediaSession API,可以使用系统快捷键操作上一首下一首 -- 😾 不能播放的歌曲会显示为灰色 -- 🖥️ 支持 PWA,可在 Chrome/Edge 里点击地址栏右边的 ➕ 安装到电脑 -- 🙉 支持显示歌曲和专辑的 Explicit 标志 -- 📺 MV 播放 -- ✔️ 每日自动签到(手机端和电脑端同时签到) -- 🌚 Light/Dark Mode 自动切换 +- 🔴 网易云账号登录(扫码/手机/邮箱登录) +- 📺 支持 MV 播放 +- 📃 支持歌词显示 +- 📻 支持私人 FM / 每日推荐歌曲 - 🚫🤝 无任何社交功能 - 🌎️ 海外用户可直接播放(需要登录网易云账号) +- 🔐 支持 [UnblockNeteaseMusic](https://github.com/UnblockNeteaseMusic/server#音源清单),自动使用[各类音源](https://github.com/UnblockNeteaseMusic/server#音源清单)替换变灰歌曲链接 (网页版不支持) + - 「各类音源」指默认启用的音源。 + - YouTube 音源需自行安装 `yt-dlp`。 +- ✔️ 每日自动签到(手机端和电脑端同时签到) +- 🌚 Light/Dark Mode 自动切换 +- 👆 支持 Touch Bar +- 🖥️ 支持 PWA,可在 Chrome/Edge 里点击地址栏右边的 ➕ 安装到电脑 +- 🟥 支持 Last.fm Scrobble +- ☁️ 支持音乐云盘 +- ⌨️ 自定义快捷键和全局快捷键 +- 🎧 支持 Mpris - 🛠 更多特性开发中 ## 📦️ 安装 Electron 版本由 [@hawtim](https://github.com/hawtim) 和 [@qier222](https://github.com/qier222) 适配并维护,支持 macOS、Windows、Linux。 -访问本项目的 [Releases](https://github.com/qier222/YesPlayMusic/releases) 页面下载安装包,或者访问 [镜像下载站 (大陆访问更快)](https://dl.bluepill.one/YesPlayMusic/) 下载。 +访问本项目的 [Releases](https://github.com/qier222/YesPlayMusic/releases) +页面下载安装包。 -## ⚙️ 部署至服务器 +- macOS 用户可以通过 Homebrew 来安装:`brew install --cask yesplaymusic` -除了下载安装包使用,你还可以将本项目部署到你的服务器上。 +- Windows 用户可以通过 Scoop 来安装:`scoop install extras/yesplaymusic` + +## ⚙️ 部署至 Vercel + +除了下载安装包使用,你还可以将本项目部署到 Vercel 或你的服务器上。下面是部署到 Vercel 的方法。 + +本项目的 Demo (https://music.qier222.com) 就是部署在 Vercel 上的网站。 + +[![Powered by Vercel](https://www.datocms-assets.com/31049/1618983297-powered-by-vercel.svg)](https://vercel.com/?utm_source=ohmusic&utm_campaign=oss) + +1. 部署网易云 API,详情参见 [Binaryify/NeteaseCloudMusicApi](https://neteasecloudmusicapi.vercel.app/#/?id=%e5%ae%89%e8%a3%85) + 。你也可以将 API 部署到 Vercel。 + +2. 点击本仓库右上角的 Fork,复制本仓库到你的 GitHub 账号。 + +3. 点击仓库的 Add File,选择 Create new file,输入 `vercel.json`,将下面的内容复制粘贴到文件中,并将 `https://your-netease-api.example.com` 替换为你刚刚部署的网易云 API 地址: + +```json +{ + "rewrites": [ + { + "source": "/api/:match*", + "destination": "https://your-netease-api.example.com/:match*" + } + ] +} +``` + +4. 打开 [Vercel.com](https://vercel.com),使用 GitHub 登录。 + +5. 点击 Import Git Repository 并选择你刚刚复制的仓库并点击 Import。 + +6. 点击 PERSONAL ACCOUNT 旁边的 Select。 + +7. 点击 Environment Variables,填写 Name 为 `VUE_APP_NETEASE_API_URL`,Value 为 `/api`,点击 Add。最后点击底部的 Deploy 就可以部署到 + Vercel 了。 + +## ⚙️ 部署到自己的服务器 + +除了部署到 Vercel,你还可以部署到自己的服务器上 1. 部署网易云 API,详情参见 [Binaryify/NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) 2. 克隆本仓库 ```sh -git clone https://github.com/qier222/YesPlayMusic.git +git clone --recursive https://github.com/qier222/YesPlayMusic.git ``` 3. 安装依赖 ```sh yarn install + ``` -4. 复制 `/.env.example` 文件为 `/.env`,修改里面 `VUE_APP_NETEASE_API_URL` 的值为网易云 API 地址。本地开发的话可以填写 API 地址为 `http://localhost:3000`,YesPlayMusic 地址为 `http://localhost:8080` +4. (可选)使用 Nginx 反向代理 API,将 API 路径映射为 `/api`,如果 API 和网页不在同一个域名下的话(跨域),会有一些 bug。 + +5. 复制 `/.env.example` 文件为 `/.env`,修改里面 `VUE_APP_NETEASE_API_URL` 的值为网易云 API 地址。本地开发的话可以填写 API 地址为 `http://localhost:3000`,YesPlayMusic 地址为 `http://localhost:8080`。如果你使用了反向代理 API,可以填写 API 地址为 `/api`。 ``` VUE_APP_NETEASE_API_URL=http://localhost:3000 ``` -5. 编译打包 +6. 编译打包 ```sh yarn run build ``` -6. 将 `/dist` 目录下的文件上传到你的 Web 服务器 +7. 将 `/dist` 目录下的文件上传到你的 Web 服务器 + +## ⚙️ 宝塔面板 docker应用商店 部署 + +1. 安装宝塔面板,前往[宝塔面板官网](https://www.bt.cn/new/download.html) ,选择正式版的脚本下载安装。 + +2. 安装后登录宝塔面板,在左侧导航栏中点击 Docker,首次进入会提示安装Docker服务,点击立即安装,按提示完成安装 + +3. 安装完成后在应用商店中找到YesPlayMusic,点击安装,配置域名、端口等基本信息即可完成安装。 + +4. 安装后在浏览器输入上一步骤设置的域名即可访问。 + +## ⚙️ Docker 部署 + +1. 构建 Docker Image + +```sh +docker build -t yesplaymusic . +``` + +2. 启动 Docker Container + +```sh +docker run -d --name YesPlayMusic -p 80:80 yesplaymusic +``` + +3. Docker Compose 启动 + +```sh +docker-compose up -d +``` + +YesPlayMusic 地址为 `http://localhost` + +## ⚙️ 部署至 Replit + +1. 新建 Repl,选择 Bash 模板 + +2. 在 Replit shell 中运行以下命令 + +```sh +bash <(curl -s -L https://raw.githubusercontent.com/qier222/YesPlayMusic/main/install-replit.sh) +``` + +3. 首次运行成功后,只需点击绿色按钮 `Run` 即可再次运行 + +4. 由于 replit 个人版限制内存为 1G(教育版为 3G),构建过程中可能会失败,请再次运行上述命令或运行以下命令: + +```sh +cd /home/runner/${REPL_SLUG}/music && yarn install && yarn run build +``` + +## 👷‍♂️ 打包客户端 + +如果在 Release 页面没有找到适合你的设备的安装包的话,你可以根据下面的步骤来打包自己的客户端。 + +1. 打包 Electron 需要用到 Node.js 和 Yarn。可前往 [Node.js 官网](https://nodejs.org/zh-cn/) 下载安装包。安装 Node.js + 后可在终端里执行 `npm install -g yarn` 来安装 Yarn。 + +2. 使用 `git clone --recursive https://github.com/qier222/YesPlayMusic.git` 克隆本仓库到本地。 + +3. 使用 `yarn install` 安装项目依赖。 + +4. 复制 `/.env.example` 文件为 `/.env` 。 + +5. 选择下列表格的命令来打包适合的你的安装包,打包出来的文件在 `/dist_electron` 目录下。了解更多信息可访问 [electron-builder 文档](https://www.electron.build/cli) + +| 命令 | 说明 | +| ------------------------------------------ | ------------------------- | +| `yarn electron:build --windows nsis:ia32` | Windows 32 位 | +| `yarn electron:build --windows nsis:arm64` | Windows ARM | +| `yarn electron:build --linux deb:armv7l` | Debian armv7l(树莓派等) | +| `yarn electron:build --macos dir:arm64` | macOS ARM | + +## :computer: 配置开发环境 + +本项目由 [NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) 提供 API。 + +运行本项目 + +```shell +# 安装依赖 +yarn install + +# 创建本地环境变量 +cp .env.example .env + +# 运行(网页端) +yarn serve + +# 运行(electron) +yarn electron:serve +``` + +本地运行 NeteaseCloudMusicApi,或者将 API [部署至 Vercel](#%EF%B8%8F-部署至-vercel) + +```shell +# 运行 API (默认 3000 端口) +yarn netease_api:run +``` ## ☑️ Todo @@ -78,16 +232,29 @@ yarn run build ## 📜 开源许可 +本项目仅供个人学习研究使用,禁止用于商业及非法用途。 + 基于 [MIT license](https://opensource.org/licenses/MIT) 许可进行开源。 +## 灵感来源 + +API 源代码来自 [Binaryify/NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) + +- [Apple Music](https://music.apple.com) +- [YouTube Music](https://music.youtube.com) +- [Spotify](https://www.spotify.com) +- [网易云音乐](https://music.163.com) + ## 🖼️ 截图 -[![artist][artist-screenshot]](https://music.bluepill.one) -[![album][album-screenshot]](https://music.bluepill.one) -[![playlist][playlist-screenshot]](https://music.bluepill.one) -[![explore][explore-screenshot]](https://music.bluepill.one) -[![search][search-screenshot]](https://music.bluepill.one) -[![home][home-screenshot]](https://music.bluepill.one) +![lyrics][lyrics-screenshot] +![library-dark][library-dark-screenshot] +![album][album-screenshot] +![home-2][home-2-screenshot] +![artist][artist-screenshot] +![search][search-screenshot] +![home][home-screenshot] +![explore][explore-screenshot] @@ -96,6 +263,8 @@ yarn run build [artist-screenshot]: images/artist.png [explore-screenshot]: images/explore.png [home-screenshot]: images/home.png +[home-2-screenshot]: images/home-2.png +[lyrics-screenshot]: images/lyrics.png [library-screenshot]: images/library.png -[playlist-screenshot]: images/playlist.png +[library-dark-screenshot]: images/library-dark.png [search-screenshot]: images/search.png diff --git a/babel.config.js b/babel.config.js index 162a3ea..707ce4a 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,3 +1,11 @@ module.exports = { - presets: ["@vue/cli-plugin-babel/preset"], + presets: [ + [ + '@vue/cli-plugin-babel/preset', + { + useBuiltIns: 'usage', + shippedProposals: true, + }, + ], + ], }; diff --git a/public/img/icons/menu@88.png b/build/icons/menu@88.png similarity index 100% rename from public/img/icons/menu@88.png rename to build/icons/menu@88.png diff --git a/devenv.lock b/devenv.lock new file mode 100644 index 0000000..9250350 --- /dev/null +++ b/devenv.lock @@ -0,0 +1,132 @@ +{ + "nodes": { + "devenv": { + "locked": { + "dir": "src/modules", + "lastModified": 1730412360, + "owner": "cachix", + "repo": "devenv", + "rev": "45847cb1f14a6d8cfa86ea943703c54a8798ae7e", + "type": "github" + }, + "original": { + "dir": "src/modules", + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1730272153, + "owner": "nixos", + "repo": "nixpkgs", + "rev": "2d2a9ddbe3f2c00747398f3dc9b05f7f2ebb0f53", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1730327045, + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "080166c15633801df010977d9d7474b4a6c549d7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nodejs16": { + "locked": { + "lastModified": 1700230496, + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a71323f68d4377d12c04a5410e214495ec598d4c", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a71323f68d4377d12c04a5410e214495ec598d4c", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": "flake-compat", + "gitignore": "gitignore", + "nixpkgs": [ + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1730302582, + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "af8a16fe5c264f5e9e18bcee2859b40a656876cf", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "devenv": "devenv", + "nixpkgs": "nixpkgs", + "nodejs16": "nodejs16", + "pre-commit-hooks": "pre-commit-hooks" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/devenv.nix b/devenv.nix new file mode 100644 index 0000000..fd6b9ce --- /dev/null +++ b/devenv.nix @@ -0,0 +1,53 @@ +{ pkgs, lib, config, inputs, ... }: + +let + nodejs16 = import inputs.nodejs16 { system = pkgs.stdenv.system; }; +in +{ + # https://devenv.sh/basics/ + env.GREET = "devenv"; + + # https://devenv.sh/packages/ + packages = [ pkgs.git ] ++ lib.optionals pkgs.stdenv.isDarwin (with pkgs.darwin.apple_sdk; [ + frameworks.AppKit + ]); + + # https://devenv.sh/languages/ + languages.javascript.enable = true; + languages.javascript.package = nodejs16.pkgs.nodejs_16; + languages.javascript.corepack.enable = true; + # languages.rust.enable = true; + + # https://devenv.sh/processes/ + # processes.cargo-watch.exec = "cargo-watch"; + + # https://devenv.sh/services/ + # services.postgres.enable = true; + + # https://devenv.sh/scripts/ + scripts.hello.exec = '' + echo hello from $GREET + ''; + + enterShell = '' + hello + git --version + ''; + + # https://devenv.sh/tasks/ + # tasks = { + # "myproj:setup".exec = "mytool build"; + # "devenv:enterShell".after = [ "myproj:setup" ]; + # }; + + # https://devenv.sh/tests/ + enterTest = '' + echo "Running tests" + git --version | grep --color=auto "${pkgs.git.version}" + ''; + + # https://devenv.sh/pre-commit-hooks/ + # pre-commit.hooks.shellcheck.enable = true; + + # See full reference at https://devenv.sh/reference/options/ +} diff --git a/devenv.yaml b/devenv.yaml new file mode 100644 index 0000000..7019c5c --- /dev/null +++ b/devenv.yaml @@ -0,0 +1,19 @@ +# yaml-language-server: $schema=https://devenv.sh/devenv.schema.json +inputs: + nixpkgs: + url: github:nixos/nixpkgs/nixpkgs-unstable + nodejs16: + url: github:nixos/nixpkgs/a71323f68d4377d12c04a5410e214495ec598d4c + +# https://github.com/cachix/devenv/issues/792#issuecomment-2043166453 +impure: true +# If you're using non-OSS software, you can set allowUnfree to true. +# allowUnfree: true + +# If you're willing to use a package that's vulnerable +# permittedInsecurePackages: +# - "openssl-1.1.1w" + +# If you have more than one devenv you can merge them +#imports: +# - ./backend diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0930218 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,39 @@ +services: + YesPlayMusic: + build: + context: . + image: yesplaymusic + container_name: YesPlayMusic + volumes: + - /etc/localtime:/etc/localtime:ro + - /etc/timezone:/etc/timezone:ro + - ./docker/nginx.conf.example:/etc/nginx/conf.d/default.conf:ro + ports: + - 80:80 + restart: always + depends_on: + - UnblockNeteaseMusic + environment: + - NODE_TLS_REJECT_UNAUTHORIZED=0 + networks: + my_network: + + UnblockNeteaseMusic: + image: pan93412/unblock-netease-music-enhanced + command: -o kugou kuwo migu bilibili pyncmd -p 80:443 -f 45.127.129.53 -e - + # environment: + # JSON_LOG: true + # LOG_LEVEL: debug + networks: + my_network: + aliases: + - music.163.com + - interface.music.163.com + - interface3.music.163.com + - interface.music.163.com.163jiasu.com + - interface3.music.163.com.163jiasu.com + restart: always + +networks: + my_network: + driver: bridge diff --git a/docker/nginx.conf.example b/docker/nginx.conf.example new file mode 100644 index 0000000..cdab218 --- /dev/null +++ b/docker/nginx.conf.example @@ -0,0 +1,28 @@ +server { + gzip on; + listen 80; + listen [::]:80; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html; + try_files $uri $uri/ /index.html; + } + + location @rewrites { + rewrite ^(.*)$ /index.html last; + } + + location /api/ { + proxy_buffers 16 32k; + proxy_buffer_size 128k; + proxy_busy_buffers_size 128k; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Host $remote_addr; + proxy_set_header X-NginX-Proxy true; + proxy_pass http://localhost:3000/; + } +} diff --git a/images/album.png b/images/album.png index 66a7715..bf5936c 100644 Binary files a/images/album.png and b/images/album.png differ diff --git a/images/artist.png b/images/artist.png index d02c91a..7b5ac77 100644 Binary files a/images/artist.png and b/images/artist.png differ diff --git a/images/explore.png b/images/explore.png index bcf4f76..7fd0cfc 100644 Binary files a/images/explore.png and b/images/explore.png differ diff --git a/images/home-2.png b/images/home-2.png new file mode 100644 index 0000000..0b98d7d Binary files /dev/null and b/images/home-2.png differ diff --git a/images/home.png b/images/home.png index 3be5d9f..6de45c6 100644 Binary files a/images/home.png and b/images/home.png differ diff --git a/images/library-dark.png b/images/library-dark.png new file mode 100644 index 0000000..ca9f67a Binary files /dev/null and b/images/library-dark.png differ diff --git a/images/library.png b/images/library.png index d6bef0f..bd28ce0 100644 Binary files a/images/library.png and b/images/library.png differ diff --git a/images/lyrics.png b/images/lyrics.png new file mode 100644 index 0000000..522747a Binary files /dev/null and b/images/lyrics.png differ diff --git a/images/playlist.png b/images/playlist.png deleted file mode 100644 index 90aa61d..0000000 Binary files a/images/playlist.png and /dev/null differ diff --git a/images/search.png b/images/search.png index fd4320a..2befdfc 100644 Binary files a/images/search.png and b/images/search.png differ diff --git a/install-replit.sh b/install-replit.sh new file mode 100644 index 0000000..c17e438 --- /dev/null +++ b/install-replit.sh @@ -0,0 +1,28 @@ + #!/usr/bin/bash + +# 初始化 .replit 和 replit.nix +if [[ $1 == i ]];then + echo -e 'run = ["bash", "main.sh"]\n\nentrypoint = "main.sh"' >.replit + echo -e "{ pkgs }: {\n\t\tdeps = [\n\t\t\tpkgs.nodejs-16_x\n\t\t\tpkgs.yarn\n\t\t\tpkgs.bashInteractive\n\t\t];\n}" > replit.nix + exit +fi + +# 安装 +if [[ ! -d api ]];then + mkdir api + git clone https://github.com/Binaryify/NeteaseCloudMusicApi ./api && \ + cd api && npm install && cd .. +fi + +if [[ ! -d music ]];then + mkdir music + git clone https://github.com/qier222/YesPlayMusic ./music && \ + cd music && cp .env.example .env && npm install --force && npm run build && cd .. +fi + +# 启动 +PID=`ps -ef | grep npm | awk '{print $2}' | sed '$d'` + +if [[ ! -z ${PID} ]];then echo $PID | xargs kill;fi +nohup bash -c 'cd api && PORT=35216 node app.js' > api.log 2>&1 +nohup bash -c 'npx serve music/dist/' > music.log 2>&1 diff --git a/jsconfig.json b/jsconfig.json index 0d612a8..7787662 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -7,7 +7,8 @@ }, "target": "ES6", "module": "commonjs", - "allowSyntheticDefaultImports": true + "allowSyntheticDefaultImports": true, + "jsx": "preserve" }, "include": ["src/**/*"], "exclude": ["node_modules"] diff --git a/netease_api/.editorconfig b/netease_api/.editorconfig deleted file mode 100644 index 6c725ce..0000000 --- a/netease_api/.editorconfig +++ /dev/null @@ -1,34 +0,0 @@ - -# EditorConfig is awesome: http://EditorConfig.org - -# top-most EditorConfig file -root = true - -# Unix-style newlines with a newline ending every file -[*] -end_of_line = lf -insert_final_newline = true - -# Matches multiple files with brace expansion notation -# Set default charset -[*.{js,py}] -charset = utf-8 - -# 4 space indentation -[*.py] -indent_style = space -indent_size = 4 - -# Tab indentation (no size specified) -[Makefile] -indent_style = tab - -# Indentation override for all JS under lib directory -[*.{js,ts}] -indent_style = space -indent_size = 2 - -# Matches the exact files either package.json or .travis.yml -[{package.json,.travis.yml}] -indent_style = space -indent_size = 2 \ No newline at end of file diff --git a/netease_api/.eslintrc.js b/netease_api/.eslintrc.js deleted file mode 100644 index e4b2246..0000000 --- a/netease_api/.eslintrc.js +++ /dev/null @@ -1,49 +0,0 @@ -module.exports = { - root: true, - parserOptions: { - parser: 'babel-eslint', - ecmaVersion: 2018, - sourceType: 'module', - }, - plugins: ['html'], - extends: ['plugin:prettier/recommended'], - env: { - browser: true, - node: true, - }, - - rules: { - indent: ['error', 2, { SwitchCase: 1 }], - 'space-infix-ops': ['error', { int32Hint: false }], - 'key-spacing': [ - 2, - { - beforeColon: false, - afterColon: true, - }, - ], - 'no-octal': 2, - 'no-redeclare': 2, - 'comma-spacing': 2, - 'no-new-object': 2, - 'arrow-spacing': 2, - quotes: [ - 2, - 'single', - { - avoidEscape: true, - allowTemplateLiterals: true, - }, - ], - }, - overrides: [ - { - files: ['**/*.ts'], - parser: '@typescript-eslint/parser', - extends: [ - 'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin - 'prettier/@typescript-eslint', - ], - }, - ], -}; diff --git a/netease_api/.gitignore b/netease_api/.gitignore deleted file mode 100644 index f284b53..0000000 --- a/netease_api/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.DS_Store -node_modules -*.log -.idea -.vscode \ No newline at end of file diff --git a/netease_api/.npmignore b/netease_api/.npmignore deleted file mode 100644 index 3f24434..0000000 --- a/netease_api/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -static -docs -node_modules \ No newline at end of file diff --git a/netease_api/.prettierrc b/netease_api/.prettierrc deleted file mode 100644 index aea847c..0000000 --- a/netease_api/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "semi": true, - "trailingComma": "all", - "singleQuote": true -} diff --git a/netease_api/README.MD b/netease_api/README.MD deleted file mode 100644 index 679cf3e..0000000 --- a/netease_api/README.MD +++ /dev/null @@ -1,312 +0,0 @@ -# 网易云音乐 API - -网易云音乐 Node.js API service - -

-Version -License -devDependencies -devDependencies - -

- -## 灵感来自 - -[disoul/electron-cloud-music](https://github.com/disoul/electron-cloud-music) - -[darknessomi/musicbox](https://github.com/darknessomi/musicbox) - -[sqaiyan/netmusic-node](https://github.com/sqaiyan/netmusic-node) - - -## 环境要求 - -需要 NodeJS 8.12+ 环境 - -## 安装 - -```shell - -$ git clone git@github.com:Binaryify/NeteaseCloudMusicApi.git - -$ npm install -``` - -或者 -```shell -$ git clone https://github.com/Binaryify/NeteaseCloudMusicApi.git - -$ npm install -``` - -## 运行 - -```shell -$ node app.js -``` - -服务器启动默认端口为 3000,若不想使用 3000 端口,可使用以下命令: Mac/Linux - -```shell -$ PORT=4000 node app.js -``` - -windows 下使用 git-bash 或者 cmder 等终端执行以下命令: - -```shell -$ set PORT=4000 && node app.js -``` - -## 可以在Node.js调用 -v3.31.0后支持Node.js调用,导入的方法为`module`内的文件名,返回内容包含`status`和`body`,`status`为状态码,`body`为请求返回内容,参考`module_example` 文件夹下的 `test.js` -```js -const { login_cellphone, user_cloud } = require('NeteaseCloudMusicApi') -async function main() { - try { - const result = await login_cellphone({ - phone: '手机号', - password: '密码' - }) - console.log(result) - const result2 = await user_cloud({ - cookie: result.body.cookie // 凭证 - }) - console.log(result2.body) - - } catch (error) { - console.log(error) - } -} -main() -``` - -## 支持 TypeScript -```ts -// test.ts -import { banner } from 'NeteaseCloudMusicApi' -banner({ type:0 }).then(res=>{ - console.log(res) -}) -``` - - -## 使用文档 - -[文档地址](https://binaryify.github.io/NeteaseCloudMusicApi) - -[文档地址2](https://neteasecloudmusicapi.vercel.app) - -![文档](https://raw.githubusercontent.com/Binaryify/NeteaseCloudMusicApi/master/static/docs.png) - - -## 功能特性 -1. 登录 -2. 刷新登录 -3. 发送验证码 -4. 校验验证码 -5. 注册(修改密码) -6. 获取用户信息 , 歌单,收藏,mv, dj 数量 -7. 获取用户歌单 -8. 获取用户电台 -9. 获取用户关注列表 -10. 获取用户粉丝列表 -11. 获取用户动态 -12. 获取用户播放记录 -13. 获取精品歌单 -14. 获取歌单详情 -15. 搜索 -16. 搜索建议 -17. 获取歌词 -18. 歌曲评论 -19. 收藏单曲到歌单 -20. 专辑评论 -21. 歌单评论 -22. mv 评论 -23. 电台节目评论 -24. banner -25. 获取歌曲详情 -26. 获取专辑内容 -27. 获取歌手单曲 -28. 获取歌手 mv -29. 获取歌手专辑 -30. 获取歌手描述 -31. 获取相似歌手 -32. 获取相似歌单 -33. 相似 mv -34. 获取相似音乐 -35. 获取最近 5 个听了这首歌的用户 -36. 获取每日推荐歌单 -37. 获取每日推荐歌曲 -38. 私人 FM -39. 签到 -40. 喜欢音乐 -41. 垃圾桶 -42. 歌单 ( 网友精选碟 ) -43. 新碟上架 -44. 热门歌手 -45. 最新 mv -46. 推荐 mv -47. 推荐歌单 -48. 推荐新音乐 -49. 推荐电台 -50. 推荐节目 -51. 独家放送 -52. mv 排行 -53. 获取 mv 数据 -54. 播放 mv/视频 -55. 排行榜 -56. 歌手榜 -57. 云盘 -58. 电台 - 推荐 -59. 电台 - 分类 -60. 电台 - 分类推荐 -61. 电台 - 订阅 -62. 电台 - 详情 -63. 电台 - 节目 -64. 给评论点赞 -65. 获取动态 -66. 热搜列表(简略) -67. 发送私信 -68. 发送私信歌单 -69. 新建歌单 -70. 收藏/取消收藏歌单 -71. 歌单分类 -72. 收藏的歌手列表 -73. 订阅的电台列表 -74. 相关歌单推荐 -75. 付费精选接口 -76. 音乐是否可用检查接口 -77. 登录状态 -78. 获取视频播放地址 -79. 发送/删除评论 -80. 热门评论 -81. 视频评论 -82. 退出登录 -83. 所有榜单 -84. 所有榜单内容摘要 -85. 收藏视频 -86. 收藏 MV -87. 视频详情 -88. 相关视频 -89. 关注用户 -90. 新歌速递 -91. 喜欢音乐列表(无序) -92. 收藏的 MV 列表 -93. 获取最新专辑 -94. 听歌打卡 -95. 获取视频标签/分类下的视频 -96. 已收藏专辑列表 -97. 获取动态评论 -98. 歌单收藏者列表 -99. 云盘歌曲删除 -100. 热门话题 -101. 电台 - 推荐类型 -102. 电台 - 非热门类型 -103. 电台 - 今日优选 -104. 心动模式/智能播放 -105. 转发动态 -106. 删除动态 -107. 分享歌曲、歌单、mv、电台、电台节目到动态 -108. 通知-私信 -109. 通知-评论 -110. 通知-@我 -111. 通知-通知 -112. 设置 -113. 云盘数据详情 -114. 私信内容 -115. 我的数字专辑 -116. batch批量请求接口 -117. 获取视频标签列表 -118. 全部mv -119. 网易出品mv -120. 收藏/取消收藏专辑 -121. 专辑动态信息 -122. 热搜列表(详细) -123. 更换绑定手机 -124. 检测手机号码是否已注册 -125. 初始化昵称 -126. 更新歌单描述 -127. 更新歌单名 -128. 更新歌单标签 -129. 默认搜索关键词 -130. 删除歌单 -131. 电台banner -132. 用户电台 -133. 热门电台 -134. 电台 - 节目详情 -135. 电台 - 节目榜 -136. 电台 - 新晋电台榜/热门电台榜 -137. 类别热门电台 -138. 云村热评 -139. 电台24小时节目榜 -140. 电台24小时主播榜 -141. 电台最热主播榜 -142. 电台主播新人榜 -143. 电台付费精品榜 -144. 歌手热门50首歌曲 -145. 购买数字专辑 -146. 获取 mv 点赞转发评论数数据 -147. 获取视频点赞转发评论数数据 -148. 调整歌单顺序 -149. 调整歌曲顺序 -150. 独家放送列表 -151. 获取推荐视频 -152. 获取视频分类列表 -153. 获取全部视频列表接口 -154. 获取历史日推可用日期列表 -155. 获取历史日推详细数据 -156. 国家编码列表 -157. 首页-发现 -158. 首页-发现-圆形图标入口列表 -159. 数字专辑-全部新碟 -160. 数字专辑-热门新碟 -161. 数字专辑&数字单曲-榜单 -162. 数字专辑-语种风格馆 -163. 数字专辑详情 -164. 更新头像 -165. 歌单封面上传 -166. 楼层评论 -167. 歌手全部歌曲 -168. 精品歌单标签列表 -169. 用户等级信息 -170. 电台个性推荐 -171. 用户绑定信息 -172. 用户绑定手机 -173. 新版评论 -174. 点赞过的视频 -175. 收藏视频到视频歌单 -176. 删除视频歌单里的视频 -177. 最近播放的视频 -178. 音乐日历 -179. 电台订阅者列表 -180. 云贝签到信息 -181. 云贝签到 -182. 云贝所有任务 -183. 云贝todo任务 -184. 云贝今日签到信息 -185. 云贝完成任务 -186. 云贝收入 -187. 云贝支出 -188. 云贝账户信息 -189. 账号信息 - -## 更新日志 - -[changelog](https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/CHANGELOG.MD) - -## 单元测试 - -```shell -$ npm test -``` - -![单元测试](https://raw.githubusercontent.com/Binaryify/NeteaseCloudMusicApi/master/static/screenshot1.png) -![单元测试](https://raw.githubusercontent.com/Binaryify/NeteaseCloudMusicApi/master/static/screenshot2.png) - -## 贡献者 -![](https://opencollective.com/NeteaseCloudMusicApi/contributors.svg?width=890) - - -## License - -[The MIT License (MIT)](https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/LICENSE) diff --git a/netease_api/app.js b/netease_api/app.js deleted file mode 100644 index b1f3294..0000000 --- a/netease_api/app.js +++ /dev/null @@ -1,117 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const express = require('express'); -const bodyParser = require('body-parser'); -const request = require('./util/request'); -const packageJSON = require('./package.json'); -const exec = require('child_process').exec; -const cache = require('./util/apicache').middleware; -const { cookieToJson } = require('./util/index'); -const fileUpload = require('express-fileupload'); -// version check -exec('npm info NeteaseCloudMusicApi version', (err, stdout, stderr) => { - if (!err) { - let version = stdout.trim(); - if (packageJSON.version < version) { - console.log( - `最新版本: ${version}, 当前版本: ${packageJSON.version}, 请及时更新`, - ); - } - } -}); - -const app = express(); - -// CORS & Preflight request -app.use((req, res, next) => { - if (req.path !== '/' && !req.path.includes('.')) { - res.set({ - 'Access-Control-Allow-Credentials': true, - 'Access-Control-Allow-Origin': req.headers.origin || '*', - 'Access-Control-Allow-Headers': 'X-Requested-With,Content-Type', - 'Access-Control-Allow-Methods': 'PUT,POST,GET,DELETE,OPTIONS', - 'Content-Type': 'application/json; charset=utf-8', - }); - } - req.method === 'OPTIONS' ? res.status(204).end() : next(); -}); - -// cookie parser -app.use((req, res, next) => { - req.cookies = {}; - (req.headers.cookie || '').split(/\s*;\s*/).forEach((pair) => { - let crack = pair.indexOf('='); - if (crack < 1 || crack == pair.length - 1) return; - req.cookies[ - decodeURIComponent(pair.slice(0, crack)).trim() - ] = decodeURIComponent(pair.slice(crack + 1)).trim(); - }); - next(); -}); - -// body parser -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ extended: false })); - -app.use(fileUpload()); - -// static -app.use(express.static(path.join(__dirname, 'public'))); - -// cache -app.use(cache('2 minutes', (req, res) => res.statusCode === 200)); -// router -const special = { - 'daily_signin.js': '/daily_signin', - 'fm_trash.js': '/fm_trash', - 'personal_fm.js': '/personal_fm', -}; - -fs.readdirSync(path.join(__dirname, 'module')) - .reverse() - .forEach((file) => { - if (!file.endsWith('.js')) return; - let route = - file in special - ? special[file] - : '/' + file.replace(/\.js$/i, '').replace(/_/g, '/'); - let question = require(path.join(__dirname, 'module', file)); - - app.use(route, (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - - question(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }); - }); - -const port = process.env.PORT || 3000; -const host = process.env.HOST || ''; - -app.server = app.listen(port, host, () => { - console.log(`server running @ http://${host ? host : 'localhost'}:${port}`); -}); - -module.exports = app; diff --git a/netease_api/buildScript.js b/netease_api/buildScript.js deleted file mode 100644 index e557384..0000000 --- a/netease_api/buildScript.js +++ /dev/null @@ -1,60 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const express = require('express'); -const request = require('./util/request'); -const strip = require('strip-comments'); -var router = express.Router(); -const special = { - 'daily_signin.js': '/daily_signin', - 'fm_trash.js': '/fm_trash', - 'personal_fm.js': '/personal_fm', -}; - -const app = express(); -const temp = {}; - -fs.readdirSync(path.join(__dirname, 'module')) - .reverse() - .forEach((file) => { - if (!file.endsWith('.js')) return; - let route = - file in special - ? special[file] - : '/' + file.replace(/\.js$/i, '').replace(/_/g, '/'); - let question = require(path.join(__dirname, 'module', file)); - // console.log(question.toString()) - const func = `(req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const ${file.replace(/\.js$/i, '')} = ${strip(question.toString())}; - ${file.replace(/\.js$/i, '')}(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - }`; - temp[route] = func; - }); - -fs.writeFileSync( - path.resolve(__dirname, './test_result.json'), - JSON.stringify(temp), -); diff --git a/netease_api/interface.d.ts b/netease_api/interface.d.ts deleted file mode 100644 index 548768d..0000000 --- a/netease_api/interface.d.ts +++ /dev/null @@ -1,1311 +0,0 @@ -export interface RequestBaseConfig { - cookie?: string; - realIP?: string; // IPv4/IPv6 filled in X-Real-IP - proxy?: string; // HTTP proxy -} - -export interface MultiPageConfig { - limit?: string | number; - offset?: string | number; -} - -export interface ImageUploadConfig { - imgFile: { - name: string; - data: string | Buffer; - }; - imgSize?: number; - imgX?: number; - imgY?: number; -} - -export interface APIBaseResponse { - code: number; - cookie: string; - [index: string]: unknown; -} - -export interface Response { - status: number; // The Http Response Code - body: APIBaseResponse; // API Response body - cookie: string[]; -} - -export const enum SubAction { - sub = 1, - unsub = 0, -} - -export function activate_init_profile( - params: { nickname: string } & RequestBaseConfig, -): Promise; - -export function album( - params: { id: string | number } & RequestBaseConfig, -): Promise; - -export function album_detail( - params: { id: string | number } & RequestBaseConfig, -): Promise; - -export function album_detail_dynamic( - params: { id: string | number } & RequestBaseConfig, -): Promise; - -export const enum AlbumListArea { - all = 'ALL', - zh = 'ZH', - ea = 'EA', - kr = 'KR', - jp = 'JP', -} - -export const enum ListOrder { - hot = 'hot', - new = 'new', -} - -export function album_list( - params: { area?: AlbumListArea; type: string } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export const enum AlbumListStyleArea { - zh = 'Z_H', - ea = 'E_A', - kr = 'KR', - jp = 'JP', -} - -export function album_list_style( - params: { area?: AlbumListStyleArea } & MultiPageConfig & RequestBaseConfig, -): Promise; - -export function album_new( - params: { area?: AlbumListArea } & MultiPageConfig & RequestBaseConfig, -): Promise; - -export function album_newest(params: RequestBaseConfig): Promise; - -export const enum AlbumSongsaleboardType { - daily = 'daily', - week = 'week', - year = 'year', - total = 'total', -} - -export const enum AlbumSongsaleboardAlbumType { - album = 0, - single = 1, -} - -export function album_songsaleboard( - params: { - albumType?: AlbumSongsaleboardAlbumType; // 0 为数字专辑,1 为数字单曲 - type?: AlbumSongsaleboardType; - year?: string | number; // 年份,默认本年。 type 为 year 时有效 - } & RequestBaseConfig, -): Promise; - -export function album_sub( - params: { - id: string | number; - t: SubAction; - } & RequestBaseConfig, -): Promise; - -export function album_sublist( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function artist_album( - params: { id: string | number } & MultiPageConfig & RequestBaseConfig, -): Promise; - -export function artist_desc( - params: { id: string | number } & RequestBaseConfig, -): Promise; - -export const enum ArtistListArea { - zh = 'Z_H', - ea = 'E_A', - kr = 'KR', - jp = 'JP', -} - -export const enum ArtistArea { - all = '-1', - zh = '7', - ea = '96', - ja = '8', - kr = '16', - other = '0', -} - -export const enum ArtistType { - male = '1', - female = '2', - band = '3', -} - -export function artist_list( - params: { - area: ArtistArea; - initial?: - | 'a' - | 'b' - | 'c' - | 'd' - | 'e' - | 'f' - | 'g' - | 'h' - | 'i' - | 'j' - | 'k' - | 'l' - | 'm' - | 'n' - | 'o' - | 'p' - | 'q' - | 'r' - | 's' - | 't' - | 'u' - | 'v' - | 'w' - | 'x' - | 'y' - | 'z' - | 'A' - | 'B' - | 'C' - | 'D' - | 'E' - | 'F' - | 'G' - | 'H' - | 'I' - | 'J' - | 'K' - | 'L' - | 'M' - | 'N' - | 'O' - | 'P' - | 'Q' - | 'R' - | 'S' - | 'T' - | 'U' - | 'V' - | 'W' - | 'X' - | 'Y' - | 'Z'; - type?: ArtistType; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function artist_mv( - params: { id: string | number } & MultiPageConfig & RequestBaseConfig, -): Promise; - -export const enum ArtistSongsOrder { - hot = 'hot', - time = 'time', -} - -export function artist_songs( - params: { - id: string | number; - order?: ArtistSongsOrder; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function artist_sub( - params: { id: string | number; t: SubAction } & RequestBaseConfig, -): Promise; - -export function artist_sublist( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function artist_top_song( - params: { - id: string | number; - } & RequestBaseConfig, -): Promise; - -export function artists( - params: { id: string | number } & RequestBaseConfig, -): Promise; - -export function avatar_upload( - params: ImageUploadConfig & RequestBaseConfig, -): Promise; - -export const enum BannerType { - pc = 0, - android = 1, - iphone = 2, - ipad = 3, -} - -export function banner( - params: { type?: BannerType } & RequestBaseConfig, -): Promise; - -export function batch( - params: { [index: string]: unknown } & RequestBaseConfig, -): Promise; - -export function captcha_sent( - params: { cellphone: string; ctcode?: string } & RequestBaseConfig, -): Promise; - -export function captcha_verify( - params: { - ctcode?: string; - cellphone: string; - captcha: string; - } & RequestBaseConfig, -): Promise; - -export function cellphone_existence_check( - params: { cellphone: string; countrycode: string } & RequestBaseConfig, -): Promise; - -export function check_music( - params: { id: string | number; br: string | number } & RequestBaseConfig, -): Promise; - -export const enum SearchType { - single = 1, - album = 10, - artist = 100, - playlist = 1000, - user = 1002, - mv = 1004, - lyric = 1006, - dj = 1009, - video = 1014, - complex = 1018, -} - -export function cloudsearch( - params: { - keywords: string; - type?: SearchType; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export const enum CommentType { - song = 0, - mv = 1, - playlist = 2, - album = 3, - dj = 4, - video = 5, - event = 6, -} - -export const enum CommentAction { - add = 1, - delete = 0, - reply = 2, -} - -export function comment( - params: { - id: string | number; - type: CommentType; - t: CommentAction.delete; - commentId: string | number; - } & RequestBaseConfig, -): Promise; - -export function comment( - params: { - type: CommentType.event; - t: CommentAction.delete; - threadId: string; - commentId: string | number; - } & RequestBaseConfig, -): Promise; - -export function comment( - params: { - id: string | number; - type: CommentType; - t: CommentAction.add; - content: string | number; - } & RequestBaseConfig, -): Promise; - -export function comment( - params: { - type: CommentType.event; - t: CommentAction.add; - threadId: string; - content: string | number; - } & RequestBaseConfig, -): Promise; - -export function comment( - params: { - id: string | number; - type: CommentType; - t: CommentAction.reply; - content: string | number; - commentId: string | number; - } & RequestBaseConfig, -): Promise; - -export function comment( - params: { - type: CommentType.event; - t: CommentAction.reply; - threadId: string; - content: string | number; - commentId: string | number; - } & RequestBaseConfig, -): Promise; - -export function comment_album( - params: { - id: string | number; - before?: string | number; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function comment_dj( - params: { - id: string | number; - before?: string | number; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function comment_event( - params: { - threadId: string; - before?: string | number; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function comment_floor( - params: { - id: string | number; - parentCommentId: string | number; - type: CommentType; - limit?: string | number; - time?: string | number; - } & RequestBaseConfig, -): Promise; - -export function comment_hot( - params: { - id: string | number; - type: CommentType; - before?: string | number; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function comment_hotwall_list( - params: RequestBaseConfig, -): Promise; - -export function comment_like( - params: { - id: string | number; - type: CommentType; - t: SubAction; - cid: string | number; - threadId?: string; - } & RequestBaseConfig, -): Promise; - -export function comment_music( - params: { - id: string | number; - before?: string | number; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function comment_mv( - params: { - id: string | number; - before?: string | number; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function comment_playlist( - params: { - id: string | number; - - before?: string | number; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function comment_video( - params: { - id: string | number; - before?: string | number; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function countries_code_list( - params: RequestBaseConfig, -): Promise; - -export const enum DailySigninType { - android = 0, - pc = 1, -} - -export function daily_signin( - params: { type?: DailySigninType } & RequestBaseConfig, -): Promise; - -export function digitalAlbum_ordering( - params: { - payment: string; - id: string | number; - quantity: string; - } & RequestBaseConfig, -): Promise; - -export function digitalAlbum_purchased( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function dj_banner(params: RequestBaseConfig): Promise; - -export function dj_category_excludehot( - params: RequestBaseConfig, -): Promise; - -export function dj_category_recommend( - params: RequestBaseConfig, -): Promise; - -export function dj_catelist(params: RequestBaseConfig): Promise; - -export function dj_detail( - params: { rid: string | number } & RequestBaseConfig, -): Promise; - -export function dj_hot( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function dj_paygift( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function dj_personalize_recommend( - params: { limit?: string | number } & RequestBaseConfig, -): Promise; - -export function dj_program( - params: { - rid: string | number; - asc: 'true' | 1 | 'false' | 0; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function dj_program_detail( - params: { id: string | number } & RequestBaseConfig, -): Promise; - -export function dj_program_toplist( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function dj_program_toplist_hours( - params: { limit?: string | number } & RequestBaseConfig, -): Promise; - -export function dj_radio_hot( - params: { - cateId: string | number; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function dj_recommend(params: RequestBaseConfig): Promise; - -/* - 有声书 10001 - 知识技能 453050 - 商业财经 453051 - 人文历史 11 - 外语世界 13 - 亲子宝贝 14 - 创作|翻唱 2001 - 音乐故事 2 - 3D|电子 10002 - 相声曲艺 8 - 情感调频 3 - 美文读物 6 - 脱口秀 5 - 广播剧 7 - 二次元 3001 - 明星做主播 1 - 娱乐|影视 4 - 科技科学 453052 - 校园|教育 4001 - 旅途|城市 12 -*/ - -export function dj_recommend_type( - params: { type: number } & RequestBaseConfig, -): Promise; - -export function dj_sub( - params: { t: SubAction; rid: string | number } & RequestBaseConfig, -): Promise; - -export function dj_sublist( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function dj_today_perfered( - params: { page?: string | number } & RequestBaseConfig, -): Promise; - -export function dj_toplist( - params: { type?: ListOrder } & MultiPageConfig & RequestBaseConfig, -): Promise; - -export function dj_toplist_hours( - params: { limit?: string | number } & RequestBaseConfig, -): Promise; - -export function dj_toplist_newcomer( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function dj_toplist_pay( - params: { limit?: string | number } & RequestBaseConfig, -): Promise; - -export function dj_toplist_popular( - params: { limit?: string | number } & RequestBaseConfig, -): Promise; - -export function event( - params: { pagesize?: number; lasttime?: number } & RequestBaseConfig, -): Promise; - -export function event_del( - params: { evId: string | number } & RequestBaseConfig, -): Promise; - -export function event_forward( - params: { - forwords: string; - evId: string | number; - uid: string | number; - } & RequestBaseConfig, -): Promise; - -export function fm_trash( - params: { id: string | number; time?: string | number } & RequestBaseConfig, -): Promise; - -export function follow( - params: { t: SubAction; id: string | number } & RequestBaseConfig, -): Promise; - -export function history_recommend_songs( - params: RequestBaseConfig, -): Promise; - -export function history_recommend_songs_detail( - params: { date?: string } & RequestBaseConfig, -): Promise; - -export function homepage_block_page( - params: { refresh?: 'true' | 'false' | boolean } & RequestBaseConfig, -): Promise; - -export function homepage_dragon_ball( - params: RequestBaseConfig, -): Promise; - -export function hot_topic( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function like( - params: { - like?: 'true' | 'false' | boolean; - id: string | number; - alg?: string; - time?: string | number; - } & RequestBaseConfig, -): Promise; - -export function likelist( - params: { uid: string | number } & RequestBaseConfig, -): Promise; - -export function login( - params: { email: string; password: string } & RequestBaseConfig, -): Promise; - -export function login( - params: { email: string; md5_password: string } & RequestBaseConfig, -): Promise; - -export function login_cellphone( - params: { - phone: string; - countrycode?: string; - password: string; - } & RequestBaseConfig, -): Promise; - -export function login_cellphone( - params: { - phone: string; - countrycode?: string; - md5_password: string; - } & RequestBaseConfig, -): Promise; - -export function login_refresh(params: RequestBaseConfig): Promise; - -export function login_status(params: RequestBaseConfig): Promise; - -export function logout(params: RequestBaseConfig): Promise; - -export function lyric( - params: { id: string | number } & RequestBaseConfig, -): Promise; - -export function msg_comments( - params: { - uid: string | number; - before?: string | number; - limit?: string | number; - } & RequestBaseConfig, -): Promise; - -export function msg_forwards( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function msg_notices( - params: { - limit?: string | number; - lasttime?: string | number; - } & RequestBaseConfig, -): Promise; - -export function msg_private( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function msg_private_history( - params: { - before?: string | number; - limit?: string | number; - uid: string | number; - } & RequestBaseConfig, -): Promise; - -export const enum MvArea { - all = '全部', - zh = '内地', - hk = '港台', - ea = '欧美', - kr = '韩国', - jp = '日本', -} - -export const enum MvType { - all = '全部', - offical = '官方版', - raw = '原生', - live = '现场版', - netease = '网易出品', -} - -export const enum MvOrder { - trend = '上升最快', - hot = '最热', - new = '最新', -} - -export function mv_all( - params: { - area?: MvArea; - type?: MvType; - order?: MvOrder; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function mv_detail( - params: { mvid?: string | number } & RequestBaseConfig, -): Promise; - -export function mv_detail_info( - params: { mvid: string | number } & RequestBaseConfig, -): Promise; - -export function mv_exclusive_rcmd( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function mv_first( - params: { area?: MvArea; limit?: string | number } & RequestBaseConfig, -): Promise; - -export function mv_sub( - params: { t: SubAction; mvid: string | number } & RequestBaseConfig, -): Promise; - -export function mv_sublist( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function mv_url( - params: { id?: string | number; r?: string | number } & RequestBaseConfig, -): Promise; - -export function personal_fm(params: RequestBaseConfig): Promise; - -export function personalized( - params: { limit?: string | number } & RequestBaseConfig, -): Promise; - -export function personalized_djprogram( - params: RequestBaseConfig, -): Promise; - -export function personalized_mv(params: RequestBaseConfig): Promise; - -export function personalized_newsong( - params: { - area?: string | number; - limit?: string | number; - } & RequestBaseConfig, -): Promise; - -export function personalized_privatecontent( - params: RequestBaseConfig, -): Promise; - -export function personalized_privatecontent_list( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function playlist_catlist(params: RequestBaseConfig): Promise; - -export function playlist_cover_update( - params: { id: string } & ImageUploadConfig & RequestBaseConfig, -): Promise; - -export function playlist_create( - params: { - name: string; - privacy: 0 | 10; - type?: PlaylistType; - } & RequestBaseConfig, -): Promise; - -export function playlist_delete( - params: { id: string | number } & RequestBaseConfig, -): Promise; - -export function playlist_desc_update( - params: { id: string | number; desc: string } & RequestBaseConfig, -): Promise; - -export function playlist_detail( - params: { id: string | number; s?: string | number } & RequestBaseConfig, -): Promise; - -export function playlist_highquality_tags( - params: RequestBaseConfig, -): Promise; - -export function playlist_hot(params: RequestBaseConfig): Promise; - -export function playlist_name_update( - params: { id: string | number; name: string } & RequestBaseConfig, -): Promise; - -export function playlist_order_update( - params: { ids: string } & RequestBaseConfig, -): Promise; - -export function playlist_subscribe( - params: { t: SubAction; id: string | number } & RequestBaseConfig, -): Promise; - -export function playlist_subscribers( - params: { id?: string | number } & MultiPageConfig & RequestBaseConfig, -): Promise; - -export function playlist_tags_update( - params: { id: string | number; tags: string } & RequestBaseConfig, -): Promise; - -export function playlist_tracks( - params: { - op: 'add' | 'del'; - pid: string | number; - tracks: string; - } & RequestBaseConfig, -): Promise; - -export function playlist_update( - params: { - id: string | number; - name: string; - desc?: string; - tags?: string; - } & RequestBaseConfig, -): Promise; - -export function playmode_intelligence_list( - params: { - id: string | number; - pid: string | number; - sid?: string | number; - count?: string | number; - } & RequestBaseConfig, -): Promise; - -export function program_recommend( - params: { type: string } & MultiPageConfig & RequestBaseConfig, -): Promise; - -export function rebind( - params: { - captcha: string; - phone: string; - oldcaptcha: string; - ctcode?: string; - } & RequestBaseConfig, -): Promise; - -export function recommend_resource( - params: RequestBaseConfig, -): Promise; - -export function recommend_songs(params: RequestBaseConfig): Promise; - -export function register_cellphone( - params: { - captcha: string; - phone: string; - password: string; - nickname: string; - } & RequestBaseConfig, -): Promise; - -export function related_allvideo( - params: { id: string | number } & RequestBaseConfig, -): Promise; - -export function related_playlist( - params: { id: string | number } & RequestBaseConfig, -): Promise; - -export const enum ResourceType { - mv = 1, - dj = 4, - video = 5, - event = 6, -} -type PlaylistType = 'NROMAL' | 'VIDEO'; - -export function resource_like( - params: { - t: SubAction; - type: ResourceType; - id?: string | number; - threadId?: string; - } & RequestBaseConfig, -): Promise; - -export function scrobble( - params: { - id: string | number; - sourceid: string | number; - time: string | number; - } & RequestBaseConfig, -): Promise; - -export function search( - params: { - keywords: string; - type?: SearchType; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function search_default(params: RequestBaseConfig): Promise; - -export function search_hot(params: RequestBaseConfig): Promise; - -export function search_hot_detail(params: RequestBaseConfig): Promise; - -export function search_multimatch( - params: { type?: number; keywords: string } & RequestBaseConfig, -): Promise; - -export const enum SearchSuggestType { - mobile = 'mobile', - web = 'web', -} - -export function search_suggest( - params: { keywords: string; type?: SearchSuggestType } & RequestBaseConfig, -): Promise; - -export function send_playlist( - params: { - playlist: string | number; - msg: string; - user_ids: string; - } & RequestBaseConfig, -): Promise; - -export function send_text( - params: { msg: string; user_ids: string } & RequestBaseConfig, -): Promise; - -export function setting(params: RequestBaseConfig): Promise; - -export const enum ShareResourceType { - song = 'song', - playlist = 'playlist', - mv = 'mv', - djprogram = 'djprogram', - djradio = 'djradio', -} - -export function share_resource( - params: { - type?: ShareResourceType; - msg?: string; - id?: string | number; - } & RequestBaseConfig, -): Promise; - -export function simi_artist( - params: { id: string | number } & RequestBaseConfig, -): Promise; - -export function simi_mv( - params: { mvid: string | number } & RequestBaseConfig, -): Promise; - -export function simi_playlist( - params: { id: string | number } & MultiPageConfig & RequestBaseConfig, -): Promise; - -export function simi_song( - params: { id: string | number } & MultiPageConfig & RequestBaseConfig, -): Promise; - -export function simi_user( - params: { id: string | number } & MultiPageConfig & RequestBaseConfig, -): Promise; - -export function song_detail( - params: { ids: string } & RequestBaseConfig, -): Promise; - -export function song_order_update( - params: { pid: string | number; ids: string } & RequestBaseConfig, -): Promise; - -export function song_url( - params: { id: string | number; br?: string | number } & RequestBaseConfig, -): Promise; - -export function top_album( - params: { - area?: AlbumListArea; - type?: ListOrder; - year?: string; - mouth?: string; - } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function top_artists( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function top_list( - params: { id: string | number } & RequestBaseConfig, -): Promise; - -export function top_mv( - params: { area?: MvArea } & MultiPageConfig & RequestBaseConfig, -): Promise; - -export function top_playlist( - params: { cat?: string; order?: ListOrder } & MultiPageConfig & - RequestBaseConfig, -): Promise; - -export function top_playlist_highquality( - params: { - cat?: string; - before?: string | number; - limit?: string | number; - } & RequestBaseConfig, -): Promise; - -export const enum TopSongType { - all = 0, - zh = 7, - ea = 96, - kr = 16, - ja = 8, -} - -export function top_song( - params: { type: TopSongType } & RequestBaseConfig, -): Promise; - -export function toplist(params: RequestBaseConfig): Promise; - -export const enum ToplistArtistType { - zh = 1, - ea = 2, - kr = 3, - ja = 4, -} - -export function toplist_artist( - params: { type?: ToplistArtistType } & RequestBaseConfig, -): Promise; - -export function toplist_detail(params: RequestBaseConfig): Promise; - -export function user_audio( - params: { uid: string | number } & RequestBaseConfig, -): Promise; - -export function user_cloud( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function user_cloud_del( - params: { id: string | number } & RequestBaseConfig, -): Promise; - -export function user_cloud_detail( - params: { id: string | number } & RequestBaseConfig, -): Promise; - -export function user_detail( - params: { uid: string | number } & RequestBaseConfig, -): Promise; - -export function user_dj( - params: { uid: string | number } & MultiPageConfig & RequestBaseConfig, -): Promise; - -export function user_event( - params: { - lasttime?: string | number; - limit?: string | number; - uid: string | number; - } & RequestBaseConfig, -): Promise; - -export function user_followeds( - params: { - uid: string | number; - lasttime?: string | number; - limit?: string | number; - } & RequestBaseConfig, -): Promise; - -export function user_follows( - params: { uid: string | number } & MultiPageConfig & RequestBaseConfig, -): Promise; - -export function user_level(params: RequestBaseConfig): Promise; - -export function user_playlist( - params: { uid: string | number } & MultiPageConfig & RequestBaseConfig, -): Promise; - -export const enum UserRecordType { - all = 0, - weekly = 1, -} - -export function user_record( - params: { uid: string | number; type?: UserRecordType } & RequestBaseConfig, -): Promise; - -export function user_subcount(params: RequestBaseConfig): Promise; - -export function user_update( - params: { - birthday: string; - city: string; - gender: string; - nickname: string; - province: string; - signature: string; - } & RequestBaseConfig, -): Promise; - -export function video_category_list( - params: MultiPageConfig & RequestBaseConfig, -): Promise; - -export function video_detail( - params: { id: string } & RequestBaseConfig, -): Promise; - -export function video_detail_info( - params: { vid: string } & RequestBaseConfig, -): Promise; - -export function video_group( - params: { id: string; offset?: string | number } & RequestBaseConfig, -): Promise; - -export function video_group_list(params: RequestBaseConfig): Promise; - -export function video_sub( - params: { t?: SubAction; id: string } & RequestBaseConfig, -): Promise; - -export function video_timeline_all( - params: { offset?: string | number } & RequestBaseConfig, -): Promise; - -export function video_timeline_recommend( - params: { offset?: string | number } & RequestBaseConfig, -): Promise; - -export function video_url( - params: { id: string | number; res?: number } & RequestBaseConfig, -): Promise; - -export function weblog( - params: { data?: { [index: string]: unknown } } & RequestBaseConfig, -): Promise; - -export function playlist_mylike( - params: { - time?: number | string; - limit: number | string; - } & RequestBaseConfig, -): Promise; - -export function playlist_track_add( - params: { pid?: number | string; ids: number | string } & RequestBaseConfig, -): Promise; - -export function playlist_track_delete( - params: { pid?: number | string; ids: number | string } & RequestBaseConfig, -): Promise; - -export function comment_new( - params: { - type?: number | string; - id: number | string; - pageNo?: number | string; - pageSize?: number | string; - sortType?: number | string; - } & RequestBaseConfig, -): Promise; - -export function calendar( - params: { - startTime?: number | string; - endTime: number | string; - } & RequestBaseConfig, -): Promise; - -export function playlist_video_recent( - params: RequestBaseConfig, -): Promise; - -export function user_binding( - params: { uid?: number | string } & RequestBaseConfig, -): Promise; - -export function user_replacephone( - params: { - phone: number | string; - captcha: number | string; - oldcaptcha: number | string; - countrycode?: number | string; - } & RequestBaseConfig, -): Promise; - -export function user_safe(params: RequestBaseConfig): Promise; - -export function dj_subscriber( - params: { - id: number | string; - limit?: number | string; - time?: number | string; - } & RequestBaseConfig, -): Promise; - -export function user_account(params: RequestBaseConfig): Promise; - -export function yunbei(params: RequestBaseConfig): Promise; - -export function yunbei_info(params: RequestBaseConfig): Promise; - -export function yunbei_sign(params: RequestBaseConfig): Promise; - -export function yunbei_receipt( - params: { - limit?: number | string; - offset?: number | string; - } & RequestBaseConfig, -): Promise; - -export function yunbei_expense( - params: { - limit?: number | string; - offset?: number | string; - } & RequestBaseConfig, -): Promise; - -export function yunbei_tasks(params: RequestBaseConfig): Promise; - -export function yunbei_today(params: RequestBaseConfig): Promise; - -export function yunbei_tasks_todo(params: RequestBaseConfig): Promise; - -export function yunbei_task_finish( - params: { - userTaskId: number | string; - depositCode?: number | string; - } & RequestBaseConfig, -): Promise; diff --git a/netease_api/main.js b/netease_api/main.js deleted file mode 100644 index 23c9295..0000000 --- a/netease_api/main.js +++ /dev/null @@ -1,26 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const request = require('./util/request'); -const { cookieToJson } = require('./util/index'); - -let obj = {}; -fs.readdirSync(path.join(__dirname, 'module')) - .reverse() - .forEach((file) => { - if (!file.endsWith('.js')) return; - let fileModule = require(path.join(__dirname, 'module', file)); - obj[file.split('.').shift()] = function (data) { - if (typeof data.cookie === 'string') { - data.cookie = cookieToJson(data.cookie); - } - return fileModule( - { - ...data, - cookie: data.cookie ? data.cookie : {}, - }, - request, - ); - }; - }); - -module.exports = obj; diff --git a/netease_api/module/activate_init_profile.js b/netease_api/module/activate_init_profile.js deleted file mode 100644 index fc69dcf..0000000 --- a/netease_api/module/activate_init_profile.js +++ /dev/null @@ -1,19 +0,0 @@ -// 初始化名字 - -module.exports = (query, request) => { - const data = { - nickname: query.nickname, - }; - return request( - 'POST', - `https://music.163.com/eapi/activate/initProfile`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - url: '/api/activate/initProfile', - }, - ); -}; diff --git a/netease_api/module/album.js b/netease_api/module/album.js deleted file mode 100644 index dd8147a..0000000 --- a/netease_api/module/album.js +++ /dev/null @@ -1,15 +0,0 @@ -// 专辑内容 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/v1/album/${query.id}`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/album_detail.js b/netease_api/module/album_detail.js deleted file mode 100644 index 8bdc16d..0000000 --- a/netease_api/module/album_detail.js +++ /dev/null @@ -1,17 +0,0 @@ -// 数字专辑详情 -module.exports = (query, request) => { - const data = { - id: query.id, - }; - return request( - 'POST', - `https://music.163.com/weapi/vipmall/albumproduct/detail`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/album_detail_dynamic.js b/netease_api/module/album_detail_dynamic.js deleted file mode 100644 index 0e30cd3..0000000 --- a/netease_api/module/album_detail_dynamic.js +++ /dev/null @@ -1,17 +0,0 @@ -// 专辑动态信息 -module.exports = (query, request) => { - const data = { - id: query.id, - }; - return request( - 'POST', - `https://music.163.com/api/album/detail/dynamic`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/album_list.js b/netease_api/module/album_list.js deleted file mode 100644 index f7b4840..0000000 --- a/netease_api/module/album_list.js +++ /dev/null @@ -1,21 +0,0 @@ -// 数字专辑-新碟上架 -module.exports = (query, request) => { - const data = { - limit: query.limit || 30, - offset: query.offset || 0, - total: true, - area: query.area || 'ALL', //ALL:全部,ZH:华语,EA:欧美,KR:韩国,JP:日本 - type: query.type, - }; - return request( - 'POST', - `https://music.163.com/weapi/vipmall/albumproduct/list`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/album_list_style.js b/netease_api/module/album_list_style.js deleted file mode 100644 index 849bf49..0000000 --- a/netease_api/module/album_list_style.js +++ /dev/null @@ -1,20 +0,0 @@ -// 数字专辑-语种风格馆 -module.exports = (query, request) => { - const data = { - limit: query.limit || 10, - offset: query.offset || 0, - total: true, - area: query.area || 'Z_H', //Z_H:华语,E_A:欧美,KR:韩国,JP:日本 - }; - return request( - 'POST', - `https://music.163.com/weapi/vipmall/appalbum/album/style`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/album_new.js b/netease_api/module/album_new.js deleted file mode 100644 index 92dd0b9..0000000 --- a/netease_api/module/album_new.js +++ /dev/null @@ -1,15 +0,0 @@ -// 全部新碟 -module.exports = (query, request) => { - const data = { - limit: query.limit || 30, - offset: query.offset || 0, - total: true, - area: query.area || 'ALL', //ALL:全部,ZH:华语,EA:欧美,KR:韩国,JP:日本 - }; - return request('POST', `https://music.163.com/weapi/album/new`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/album_newest.js b/netease_api/module/album_newest.js deleted file mode 100644 index 6fa6ee6..0000000 --- a/netease_api/module/album_newest.js +++ /dev/null @@ -1,15 +0,0 @@ -// 最新专辑 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/api/discovery/newAlbum`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/album_songsaleboard.js b/netease_api/module/album_songsaleboard.js deleted file mode 100644 index 236864f..0000000 --- a/netease_api/module/album_songsaleboard.js +++ /dev/null @@ -1,24 +0,0 @@ -// 数字专辑&数字单曲-榜单 -module.exports = (query, request) => { - let data = { - albumType: query.albumType || 0, //0为数字专辑,1为数字单曲 - }; - const type = query.type || 'daily'; // daily,week,year,total - if (type === 'year') { - data = { - ...data, - year: query.year, - }; - } - return request( - 'POST', - `https://music.163.com/api/feealbum/songsaleboard/${type}/type`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/album_sub.js b/netease_api/module/album_sub.js deleted file mode 100644 index 3be83fb..0000000 --- a/netease_api/module/album_sub.js +++ /dev/null @@ -1,14 +0,0 @@ -// 收藏/取消收藏专辑 - -module.exports = (query, request) => { - query.t = query.t == 1 ? 'sub' : 'unsub'; - const data = { - id: query.id, - }; - return request('POST', `https://music.163.com/api/album/${query.t}`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/album_sublist.js b/netease_api/module/album_sublist.js deleted file mode 100644 index d71ab5b..0000000 --- a/netease_api/module/album_sublist.js +++ /dev/null @@ -1,15 +0,0 @@ -// 已收藏专辑列表 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 25, - offset: query.offset || 0, - total: true, - }; - return request('POST', `https://music.163.com/weapi/album/sublist`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/artist_album.js b/netease_api/module/artist_album.js deleted file mode 100644 index 7e37321..0000000 --- a/netease_api/module/artist_album.js +++ /dev/null @@ -1,20 +0,0 @@ -// 歌手专辑列表 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 30, - offset: query.offset || 0, - total: true, - }; - return request( - 'POST', - `https://music.163.com/weapi/artist/albums/${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/artist_desc.js b/netease_api/module/artist_desc.js deleted file mode 100644 index 120c592..0000000 --- a/netease_api/module/artist_desc.js +++ /dev/null @@ -1,18 +0,0 @@ -// 歌手介绍 - -module.exports = (query, request) => { - const data = { - id: query.id, - }; - return request( - 'POST', - `https://music.163.com/weapi/artist/introduction`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/artist_list.js b/netease_api/module/artist_list.js deleted file mode 100644 index 605b376..0000000 --- a/netease_api/module/artist_list.js +++ /dev/null @@ -1,37 +0,0 @@ -// 歌手分类 - -/* - type 取值 - 1:男歌手 - 2:女歌手 - 3:乐队 - - area 取值 - -1:全部 - 7华语 - 96欧美 - 8:日本 - 16韩国 - 0:其他 - - initial 取值 a-z/A-Z -*/ - -module.exports = (query, request) => { - const data = { - initial: isNaN(query.initial) - ? (query.initial || '').toUpperCase().charCodeAt() || undefined - : query.initial, - offset: query.offset || 0, - limit: query.limit || 30, - total: true, - type: query.type || '1', - area: query.area, - }; - return request('POST', `https://music.163.com/api/v1/artist/list`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/artist_mv.js b/netease_api/module/artist_mv.js deleted file mode 100644 index 1195c92..0000000 --- a/netease_api/module/artist_mv.js +++ /dev/null @@ -1,16 +0,0 @@ -// 歌手相关MV - -module.exports = (query, request) => { - const data = { - artistId: query.id, - limit: query.limit, - offset: query.offset, - total: true, - }; - return request('POST', `https://music.163.com/weapi/artist/mvs`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/artist_songs.js b/netease_api/module/artist_songs.js deleted file mode 100644 index 4f74653..0000000 --- a/netease_api/module/artist_songs.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - id: query.id, - private_cloud: 'true', - work_type: 1, - order: query.order || 'hot', //hot,time - offset: query.offset || 0, - limit: query.limit || 100, - }; - return request('POST', `https://music.163.com/api/v1/artist/songs`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/artist_sub.js b/netease_api/module/artist_sub.js deleted file mode 100644 index abe238b..0000000 --- a/netease_api/module/artist_sub.js +++ /dev/null @@ -1,20 +0,0 @@ -// 收藏与取消收藏歌手 - -module.exports = (query, request) => { - query.t = query.t == 1 ? 'sub' : 'unsub'; - const data = { - artistId: query.id, - artistIds: '[' + query.id + ']', - }; - return request( - 'POST', - `https://music.163.com/weapi/artist/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/artist_sublist.js b/netease_api/module/artist_sublist.js deleted file mode 100644 index f1a8b31..0000000 --- a/netease_api/module/artist_sublist.js +++ /dev/null @@ -1,15 +0,0 @@ -// 关注歌手列表 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 25, - offset: query.offset || 0, - total: true, - }; - return request('POST', `https://music.163.com/weapi/artist/sublist`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/artist_top_song.js b/netease_api/module/artist_top_song.js deleted file mode 100644 index 79698a7..0000000 --- a/netease_api/module/artist_top_song.js +++ /dev/null @@ -1,12 +0,0 @@ -// 歌手热门 50 首歌曲 -module.exports = (query, request) => { - const data = { - id: query.id, - }; - return request('POST', `https://music.163.com/api/artist/top/song`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/artists.js b/netease_api/module/artists.js deleted file mode 100644 index 0ab1d87..0000000 --- a/netease_api/module/artists.js +++ /dev/null @@ -1,15 +0,0 @@ -// 歌手单曲 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/v1/artist/${query.id}`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/audio_match.js b/netease_api/module/audio_match.js deleted file mode 100644 index 53b5c20..0000000 --- a/netease_api/module/audio_match.js +++ /dev/null @@ -1,19 +0,0 @@ -const realData = - 'eJx10mtIU2EcBvDtnCwNMfO2klUSmSQ5ZugKW/v/0TIjJVdhDStbXpqXrhY5Kwhtrcwiut9VSqMUMxX6IFqsD92sD1YgWGHRBcowKrpnPa/v+drg4flt572ds2PQ6XQut7MwJ940w2TOyS0pzF+/BV/MJrNO+3TVLOHUzKx5iw3/H5uZ7yxegct3tTl7Cr6QEa0gZ/dZOFsvfe5YHe1D+yFZxpncqEj/cCdwoirdVxHNnZrX3xygU5g7Eh6I9uOx8Ch4y9FQjlKkDz1pYrFXIJLUOovFGcYivqJgXqaXDqu7Rzc0XzmZxG81B/fF8wRVusn2jN5rDnwca8tFhyAJP4L4qiI9vX8cWzEmVKzT/46qxNpIdZOZz2HNcHhSkZ3D4AjYFpfGFkX6+dB+FvcSBe/SWbkLPVnEOJ1DFelXxVVci/Wj4TsBLhrQ/LGoaU4HxsTA28L76Cc8Dfau/U6F6FgkyBDDJar0g8tesmOvOHioWeXXmme6l3MLbIIre6wciU5E2t/k8WVxHfHvuUWXsH4SPCv1NW1Cz0aivgYO34vw1AEvi3MlIw0xHl6JNVPEGW41UJsqPaXYYTuEnotMdHwYfv7CFR/i+aXmrY5wrlSkEwr+0EJ0GvLmdw4/RS9Amj93UAbGZMIF40ezE3PtcG/yBWrT3L6oh66hFyMXK4xsUKT7aufzapxnFTwiNc3Wis5Bdm+OYCvmOuHj/ZeoQPOI00PUrUjXpG+kMFU61tFFDvQaZOn5DH4mzoLw4Hsaj14rzu/K4jF66fSWTnJinW3wBvcveqjZN3iFjKp0qKuF1mi21keST3NtTcbwu1eG3Dussr9eemljLIco0tVH7HwA493wOr+FlIjfy+GvkR4uwfjt4v/6G8K3NX8K38lt6B1ISa+Bv2O8Fy69foZOovci2S4Lr1aku4P9OEWVTt9wgMQ7exgJ8JXyI0W694WFyuBjcH75XyrEXsfhg+ZSvqZIf/Lct8Wp0md2tJN4PifEfjcm8gu02Ptbj459eum8eg8bFWlLXTb/A+uo9bM='; -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - algorithmCode: 'shazam_v2', - times: 1, - sessionId: 'C999431ACDC84EDBB984763654E6F8D7', - duration: 3.3066249999999995, - from: 'recognize-song', - rawdata: realData, - }; - return request('POST', `https://music.163.com/api/music/audio/match`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/avatar_upload.js b/netease_api/module/avatar_upload.js deleted file mode 100644 index a09e65e..0000000 --- a/netease_api/module/avatar_upload.js +++ /dev/null @@ -1,27 +0,0 @@ -const uploadPlugin = require('../plugins/upload'); -module.exports = async (query, request) => { - const uploadInfo = await uploadPlugin(query, request); - const res = await request( - 'POST', - `https://music.163.com/weapi/user/avatar/upload/v1`, - { - imgid: uploadInfo.imgId, - }, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - return { - status: 200, - body: { - code: 200, - data: { - ...uploadInfo, - ...res.body, - }, - }, - }; -}; diff --git a/netease_api/module/banner.js b/netease_api/module/banner.js deleted file mode 100644 index c2fb384..0000000 --- a/netease_api/module/banner.js +++ /dev/null @@ -1,17 +0,0 @@ -// 首页轮播图 - -module.exports = (query, request) => { - const type = - { - 0: 'pc', - 1: 'android', - 2: 'iphone', - 3: 'ipad', - }[query.type || 0] || 'pc'; - return request( - 'POST', - `https://music.163.com/api/v2/banner/get`, - { clientType: type }, - { crypto: 'linuxapi', proxy: query.proxy, realIP: query.realIP }, - ); -}; diff --git a/netease_api/module/batch.js b/netease_api/module/batch.js deleted file mode 100644 index dd2e88e..0000000 --- a/netease_api/module/batch.js +++ /dev/null @@ -1,19 +0,0 @@ -// 批量请求接口 - -module.exports = (query, request) => { - const data = { - e_r: true, - }; - Object.keys(query).forEach((i) => { - if (/^\/api\//.test(i)) { - data[i] = query[i]; - } - }); - return request('POST', `https://music.163.com/eapi/batch`, data, { - crypto: 'eapi', - proxy: query.proxy, - url: '/api/batch', - cookie: query.cookie, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/calendar.js b/netease_api/module/calendar.js deleted file mode 100644 index 2abff77..0000000 --- a/netease_api/module/calendar.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = (query, request) => { - const data = { - startTime: query.startTime || Date.now(), - endTime: query.endTime || Date.now(), - }; - return request('POST', `https://music.163.com/api/mcalendar/detail`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/captcha_sent.js b/netease_api/module/captcha_sent.js deleted file mode 100644 index 6cae966..0000000 --- a/netease_api/module/captcha_sent.js +++ /dev/null @@ -1,14 +0,0 @@ -// 发送验证码 - -module.exports = (query, request) => { - const data = { - ctcode: query.ctcode || '86', - cellphone: query.phone, - }; - return request('POST', `https://music.163.com/weapi/sms/captcha/sent`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/captcha_verify.js b/netease_api/module/captcha_verify.js deleted file mode 100644 index f0edf1c..0000000 --- a/netease_api/module/captcha_verify.js +++ /dev/null @@ -1,20 +0,0 @@ -// 校验验证码 - -module.exports = (query, request) => { - const data = { - ctcode: query.ctcode || '86', - cellphone: query.phone, - captcha: query.captcha, - }; - return request( - 'POST', - `https://music.163.com/weapi/sms/captcha/verify`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/cellphone_existence_check.js b/netease_api/module/cellphone_existence_check.js deleted file mode 100644 index bb28316..0000000 --- a/netease_api/module/cellphone_existence_check.js +++ /dev/null @@ -1,20 +0,0 @@ -// 检测手机号码是否已注册 - -module.exports = (query, request) => { - const data = { - cellphone: query.phone, - countrycode: query.countrycode, - }; - return request( - 'POST', - `https://music.163.com/eapi/cellphone/existence/check`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/cellphone/existence/check', - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/check_music.js b/netease_api/module/check_music.js deleted file mode 100644 index 6aed6fd..0000000 --- a/netease_api/module/check_music.js +++ /dev/null @@ -1,34 +0,0 @@ -// 歌曲可用性 - -module.exports = (query, request) => { - const data = { - ids: '[' + parseInt(query.id) + ']', - br: parseInt(query.br || 999000), - }; - return request( - 'POST', - `https://music.163.com/weapi/song/enhance/player/url`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ).then((response) => { - let playable = false; - if (response.body.code == 200) { - if (response.body.data[0].code == 200) { - playable = true; - } - } - if (playable) { - response.body = { success: true, message: 'ok' }; - return response; - } else { - response.status = 404; - response.body = { success: false, message: '亲爱的,暂无版权' }; - return Promise.reject(response); - } - }); -}; diff --git a/netease_api/module/cloudsearch.js b/netease_api/module/cloudsearch.js deleted file mode 100644 index f7bd53e..0000000 --- a/netease_api/module/cloudsearch.js +++ /dev/null @@ -1,21 +0,0 @@ -// 搜索 - -module.exports = (query, request) => { - const data = { - s: query.keywords, - type: query.type || 1, // 1: 单曲, 10: 专辑, 100: 歌手, 1000: 歌单, 1002: 用户, 1004: MV, 1006: 歌词, 1009: 电台, 1014: 视频 - limit: query.limit || 30, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/cloudsearch/get/web`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/comment.js b/netease_api/module/comment.js deleted file mode 100644 index c3e0bab..0000000 --- a/netease_api/module/comment.js +++ /dev/null @@ -1,43 +0,0 @@ -// 发送与删除评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - query.t = { - 1: 'add', - 0: 'delete', - 2: 'reply', - }[query.t]; - query.type = { - 0: 'R_SO_4_', // 歌曲 - 1: 'R_MV_5_', // MV - 2: 'A_PL_0_', // 歌单 - 3: 'R_AL_3_', // 专辑 - 4: 'A_DJ_1_', // 电台, - 5: 'R_VI_62_', // 视频 - 6: 'A_EV_2_', // 动态 - }[query.type]; - const data = { - threadId: query.type + query.id, - }; - - if (query.type == 'A_EV_2_') { - data.threadId = query.threadId; - } - if (query.t == 'add') data.content = query.content; - else if (query.t == 'delete') data.commentId = query.commentId; - else if (query.t == 'reply') { - data.commentId = query.commentId; - data.content = query.content; - } - return request( - 'POST', - `https://music.163.com/weapi/resource/comments/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/comment_album.js b/netease_api/module/comment_album.js deleted file mode 100644 index f873655..0000000 --- a/netease_api/module/comment_album.js +++ /dev/null @@ -1,22 +0,0 @@ -// 专辑评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/R_AL_3_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/comment_dj.js b/netease_api/module/comment_dj.js deleted file mode 100644 index 27d32d1..0000000 --- a/netease_api/module/comment_dj.js +++ /dev/null @@ -1,22 +0,0 @@ -// 电台评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/A_DJ_1_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/comment_event.js b/netease_api/module/comment_event.js deleted file mode 100644 index cf89ade..0000000 --- a/netease_api/module/comment_event.js +++ /dev/null @@ -1,20 +0,0 @@ -// 获取动态评论 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/${query.threadId}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/comment_floor.js b/netease_api/module/comment_floor.js deleted file mode 100644 index 818584b..0000000 --- a/netease_api/module/comment_floor.js +++ /dev/null @@ -1,27 +0,0 @@ -module.exports = (query, request) => { - query.type = { - 0: 'R_SO_4_', // 歌曲 - 1: 'R_MV_5_', // MV - 2: 'A_PL_0_', // 歌单 - 3: 'R_AL_3_', // 专辑 - 4: 'A_DJ_1_', // 电台, - 5: 'R_VI_62_', // 视频 - }[query.type]; - const data = { - parentCommentId: query.parentCommentId, - threadId: query.type + query.id, - time: query.time || -1, - limit: query.limit || 20, - }; - return request( - 'POST', - `https://music.163.com/api/resource/comment/floor/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/comment_hot.js b/netease_api/module/comment_hot.js deleted file mode 100644 index 749e318..0000000 --- a/netease_api/module/comment_hot.js +++ /dev/null @@ -1,30 +0,0 @@ -// 热门评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - query.type = { - 0: 'R_SO_4_', // 歌曲 - 1: 'R_MV_5_', // MV - 2: 'A_PL_0_', // 歌单 - 3: 'R_AL_3_', // 专辑 - 4: 'A_DJ_1_', // 电台, - 5: 'R_VI_62_', // 视频 - }[query.type]; - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/hotcomments/${query.type}${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/comment_hotwall_list.js b/netease_api/module/comment_hotwall_list.js deleted file mode 100644 index 0b7e67a..0000000 --- a/netease_api/module/comment_hotwall_list.js +++ /dev/null @@ -1,16 +0,0 @@ -// 云村热评 - -module.exports = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/comment/hotwall/list/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/comment_like.js b/netease_api/module/comment_like.js deleted file mode 100644 index e2cfca7..0000000 --- a/netease_api/module/comment_like.js +++ /dev/null @@ -1,33 +0,0 @@ -// 点赞与取消点赞评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - query.t = query.t == 1 ? 'like' : 'unlike'; - query.type = { - 0: 'R_SO_4_', // 歌曲 - 1: 'R_MV_5_', // MV - 2: 'A_PL_0_', // 歌单 - 3: 'R_AL_3_', // 专辑 - 4: 'A_DJ_1_', // 电台, - 5: 'R_VI_62_', // 视频 - 6: 'A_EV_2_', // 动态 - }[query.type]; - const data = { - threadId: query.type + query.id, - commentId: query.cid, - }; - if (query.type == 'A_EV_2_') { - data.threadId = query.threadId; - } - return request( - 'POST', - `https://music.163.com/weapi/v1/comment/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/comment_music.js b/netease_api/module/comment_music.js deleted file mode 100644 index 9824605..0000000 --- a/netease_api/module/comment_music.js +++ /dev/null @@ -1,22 +0,0 @@ -// 歌曲评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/api/v1/resource/comments/R_SO_4_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/comment_mv.js b/netease_api/module/comment_mv.js deleted file mode 100644 index 3ce3ba9..0000000 --- a/netease_api/module/comment_mv.js +++ /dev/null @@ -1,22 +0,0 @@ -// MV评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/R_MV_5_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/comment_new.js b/netease_api/module/comment_new.js deleted file mode 100644 index 97f51dc..0000000 --- a/netease_api/module/comment_new.js +++ /dev/null @@ -1,38 +0,0 @@ -// 评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - query.type = { - 0: 'R_SO_4_', // 歌曲 - 1: 'R_MV_5_', // MV - 2: 'A_PL_0_', // 歌单 - 3: 'R_AL_3_', // 专辑 - 4: 'A_DJ_1_', // 电台, - 5: 'R_VI_62_', // 视频 - 6: 'A_EV_2_', // 动态 - }[query.type]; - const threadId = query.type + query.id; - const pageSize = query.pageSize || 20; - const pageNo = query.pageNo || 1; - const data = { - threadId: threadId, //'R_SO_4_863481066', - pageNo, - showInner: query.showInner || true, - pageSize, - cursor: - +query.sortType === 3 ? query.cursor || '0' : (pageNo - 1) * pageSize, - sortType: query.sortType || 1, //1:按推荐排序,2:按热度排序,3:按时间排序 - }; - return request( - 'POST', - `https://music.163.com/api/v2/resource/comments`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - url: '/api/v2/resource/comments', - }, - ); -}; diff --git a/netease_api/module/comment_playlist.js b/netease_api/module/comment_playlist.js deleted file mode 100644 index 37b2465..0000000 --- a/netease_api/module/comment_playlist.js +++ /dev/null @@ -1,22 +0,0 @@ -// 歌单评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/A_PL_0_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/comment_video.js b/netease_api/module/comment_video.js deleted file mode 100644 index af9def1..0000000 --- a/netease_api/module/comment_video.js +++ /dev/null @@ -1,22 +0,0 @@ -// 视频评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/R_VI_62_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/countries_code_list.js b/netease_api/module/countries_code_list.js deleted file mode 100644 index fefe732..0000000 --- a/netease_api/module/countries_code_list.js +++ /dev/null @@ -1,16 +0,0 @@ -// 国家编码列表 -module.exports = (query, request) => { - const data = {}; - return request( - 'POST', - `https://interface3.music.163.com/eapi/lbs/countries/v1`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/lbs/countries/v1', - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/daily_signin.js b/netease_api/module/daily_signin.js deleted file mode 100644 index 4c0d404..0000000 --- a/netease_api/module/daily_signin.js +++ /dev/null @@ -1,20 +0,0 @@ -// 签到 - -/* - 0为安卓端签到 3点经验, 1为网页签到,2点经验 - 签到成功 {'android': {'point': 3, 'code': 200}, 'web': {'point': 2, 'code': 200}} - 重复签到 {'android': {'code': -2, 'msg': '重复签到'}, 'web': {'code': -2, 'msg': '重复签到'}} - 未登录 {'android': {'code': 301}, 'web': {'code': 301}} -*/ - -module.exports = (query, request) => { - const data = { - type: query.type || 0, - }; - return request('POST', `https://music.163.com/weapi/point/dailyTask`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/digitalAlbum_ordering.js b/netease_api/module/digitalAlbum_ordering.js deleted file mode 100644 index 9c23a9c..0000000 --- a/netease_api/module/digitalAlbum_ordering.js +++ /dev/null @@ -1,27 +0,0 @@ -// 购买数字专辑 - -module.exports = (query, request) => { - const data = { - business: 'Album', - paymentMethod: query.payment, - digitalResources: JSON.stringify([ - { - business: 'Album', - resourceID: query.id, - quantity: query.quantity, - }, - ]), - from: 'web', - }; - return request( - 'POST', - `https://music.163.com/api/ordering/web/digital`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/digitalAlbum_purchased.js b/netease_api/module/digitalAlbum_purchased.js deleted file mode 100644 index ad4b43f..0000000 --- a/netease_api/module/digitalAlbum_purchased.js +++ /dev/null @@ -1,20 +0,0 @@ -// 我的数字专辑 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 30, - offset: query.offset || 0, - total: true, - }; - return request( - 'POST', - `https://music.163.com/api/digitalAlbum/purchased`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_banner.js b/netease_api/module/dj_banner.js deleted file mode 100644 index 8bb4ffc..0000000 --- a/netease_api/module/dj_banner.js +++ /dev/null @@ -1,17 +0,0 @@ -// 电台banner - -module.exports = (query, request) => { - const data = {}; - query.cookie.os = 'pc'; - return request( - 'POST', - `https://music.163.com/weapi/djradio/banner/get`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_category_excludehot.js b/netease_api/module/dj_category_excludehot.js deleted file mode 100644 index 339b727..0000000 --- a/netease_api/module/dj_category_excludehot.js +++ /dev/null @@ -1,15 +0,0 @@ -// 电台非热门类型 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/djradio/category/excludehot`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_category_recommend.js b/netease_api/module/dj_category_recommend.js deleted file mode 100644 index 6461e67..0000000 --- a/netease_api/module/dj_category_recommend.js +++ /dev/null @@ -1,15 +0,0 @@ -// 电台推荐类型 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/djradio/home/category/recommend`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_catelist.js b/netease_api/module/dj_catelist.js deleted file mode 100644 index 3ea33ec..0000000 --- a/netease_api/module/dj_catelist.js +++ /dev/null @@ -1,15 +0,0 @@ -// 电台分类列表 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/djradio/category/get`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_detail.js b/netease_api/module/dj_detail.js deleted file mode 100644 index de4c9f2..0000000 --- a/netease_api/module/dj_detail.js +++ /dev/null @@ -1,13 +0,0 @@ -// 电台详情 - -module.exports = (query, request) => { - const data = { - id: query.rid, - }; - return request('POST', `https://music.163.com/api/djradio/v2/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/dj_hot.js b/netease_api/module/dj_hot.js deleted file mode 100644 index 74474d6..0000000 --- a/netease_api/module/dj_hot.js +++ /dev/null @@ -1,14 +0,0 @@ -// 热门电台 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 30, - offset: query.offset || 0, - }; - return request('POST', `https://music.163.com/weapi/djradio/hot/v1`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/dj_paygift.js b/netease_api/module/dj_paygift.js deleted file mode 100644 index 19d0f89..0000000 --- a/netease_api/module/dj_paygift.js +++ /dev/null @@ -1,19 +0,0 @@ -// 付费电台 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 30, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/djradio/home/paygift/list?_nmclfl=1`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_personalize_recommend.js b/netease_api/module/dj_personalize_recommend.js deleted file mode 100644 index 2ddd0a9..0000000 --- a/netease_api/module/dj_personalize_recommend.js +++ /dev/null @@ -1,17 +0,0 @@ -// 电台个性推荐 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/api/djradio/personalize/rcmd`, - { - limit: query.limit || 6, - }, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_program.js b/netease_api/module/dj_program.js deleted file mode 100644 index 961ef03..0000000 --- a/netease_api/module/dj_program.js +++ /dev/null @@ -1,21 +0,0 @@ -// 电台节目列表 -const { toBoolean } = require('../util'); -module.exports = (query, request) => { - const data = { - radioId: query.rid, - limit: query.limit || 30, - offset: query.offset || 0, - asc: toBoolean(query.asc), - }; - return request( - 'POST', - `https://music.163.com/weapi/dj/program/byradio`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_program_detail.js b/netease_api/module/dj_program_detail.js deleted file mode 100644 index 395160a..0000000 --- a/netease_api/module/dj_program_detail.js +++ /dev/null @@ -1,13 +0,0 @@ -// 电台节目详情 - -module.exports = (query, request) => { - const data = { - id: query.id, - }; - return request('POST', `https://music.163.com/api/dj/program/detail`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/dj_program_toplist.js b/netease_api/module/dj_program_toplist.js deleted file mode 100644 index 60c2b8f..0000000 --- a/netease_api/module/dj_program_toplist.js +++ /dev/null @@ -1,14 +0,0 @@ -// 电台节目榜 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 100, - offset: query.offset || 0, - }; - return request('POST', `https://music.163.com/api/program/toplist/v1`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/dj_program_toplist_hours.js b/netease_api/module/dj_program_toplist_hours.js deleted file mode 100644 index 72cf980..0000000 --- a/netease_api/module/dj_program_toplist_hours.js +++ /dev/null @@ -1,18 +0,0 @@ -// 电台24小时节目榜 -module.exports = (query, request) => { - const data = { - limit: query.limit || 100, - // 不支持 offset - }; - return request( - 'POST', - `https://music.163.com/api/djprogram/toplist/hours`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_radio_hot.js b/netease_api/module/dj_radio_hot.js deleted file mode 100644 index 6533b35..0000000 --- a/netease_api/module/dj_radio_hot.js +++ /dev/null @@ -1,15 +0,0 @@ -// 类别热门电台 - -module.exports = (query, request) => { - const data = { - cateId: query.cateId, - limit: query.limit || 30, - offset: query.offset || 0, - }; - return request('POST', `https://music.163.com/api/djradio/hot`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/dj_recommend.js b/netease_api/module/dj_recommend.js deleted file mode 100644 index 9c530a2..0000000 --- a/netease_api/module/dj_recommend.js +++ /dev/null @@ -1,15 +0,0 @@ -// 精选电台 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/djradio/recommend/v1`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_recommend_type.js b/netease_api/module/dj_recommend_type.js deleted file mode 100644 index b864404..0000000 --- a/netease_api/module/dj_recommend_type.js +++ /dev/null @@ -1,41 +0,0 @@ -// 精选电台分类 - -/* - 有声书 10001 - 知识技能 453050 - 商业财经 453051 - 人文历史 11 - 外语世界 13 - 亲子宝贝 14 - 创作|翻唱 2001 - 音乐故事 2 - 3D|电子 10002 - 相声曲艺 8 - 情感调频 3 - 美文读物 6 - 脱口秀 5 - 广播剧 7 - 二次元 3001 - 明星做主播 1 - 娱乐|影视 4 - 科技科学 453052 - 校园|教育 4001 - 旅途|城市 12 -*/ - -module.exports = (query, request) => { - const data = { - cateId: query.type, - }; - return request( - 'POST', - `https://music.163.com/weapi/djradio/recommend`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_sub.js b/netease_api/module/dj_sub.js deleted file mode 100644 index 5375514..0000000 --- a/netease_api/module/dj_sub.js +++ /dev/null @@ -1,19 +0,0 @@ -// 订阅与取消电台 - -module.exports = (query, request) => { - query.t = query.t == 1 ? 'sub' : 'unsub'; - const data = { - id: query.rid, - }; - return request( - 'POST', - `https://music.163.com/weapi/djradio/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_sublist.js b/netease_api/module/dj_sublist.js deleted file mode 100644 index b3a90e1..0000000 --- a/netease_api/module/dj_sublist.js +++ /dev/null @@ -1,20 +0,0 @@ -// 订阅电台列表 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 30, - offset: query.offset || 0, - total: true, - }; - return request( - 'POST', - `https://music.163.com/weapi/djradio/get/subed`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_subscriber.js b/netease_api/module/dj_subscriber.js deleted file mode 100644 index 129df40..0000000 --- a/netease_api/module/dj_subscriber.js +++ /dev/null @@ -1,16 +0,0 @@ -// 电台详情 - -module.exports = (query, request) => { - const data = { - time: query.time || '-1', - id: query.id, - limit: query.limit || '20', - total: 'true', - }; - return request('POST', `https://music.163.com/api/djradio/subscriber`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/dj_today_perfered.js b/netease_api/module/dj_today_perfered.js deleted file mode 100644 index 0f50c69..0000000 --- a/netease_api/module/dj_today_perfered.js +++ /dev/null @@ -1,18 +0,0 @@ -// 电台今日优选 - -module.exports = (query, request) => { - const data = { - page: query.page || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/djradio/home/today/perfered`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_toplist.js b/netease_api/module/dj_toplist.js deleted file mode 100644 index 36249da..0000000 --- a/netease_api/module/dj_toplist.js +++ /dev/null @@ -1,18 +0,0 @@ -// 新晋电台榜/热门电台榜 -const typeMap = { - new: 0, - hot: 1, -}; -module.exports = (query, request) => { - const data = { - limit: query.limit || 100, - offset: query.offset || 0, - type: typeMap[query.type || 'new'] || '0', //0为新晋,1为热门 - }; - return request('POST', `https://music.163.com/api/djradio/toplist`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/dj_toplist_hours.js b/netease_api/module/dj_toplist_hours.js deleted file mode 100644 index 193396d..0000000 --- a/netease_api/module/dj_toplist_hours.js +++ /dev/null @@ -1,14 +0,0 @@ -// 电台24小时主播榜 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 100, - // 不支持 offset - }; - return request('POST', `https://music.163.com/api/dj/toplist/hours`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/dj_toplist_newcomer.js b/netease_api/module/dj_toplist_newcomer.js deleted file mode 100644 index 1a0ad48..0000000 --- a/netease_api/module/dj_toplist_newcomer.js +++ /dev/null @@ -1,18 +0,0 @@ -// 电台新人榜 -module.exports = (query, request) => { - const data = { - limit: query.limit || 100, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/api/dj/toplist/newcomer`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_toplist_pay.js b/netease_api/module/dj_toplist_pay.js deleted file mode 100644 index 2b260ff..0000000 --- a/netease_api/module/dj_toplist_pay.js +++ /dev/null @@ -1,18 +0,0 @@ -// 付费精品 -module.exports = (query, request) => { - const data = { - limit: query.limit || 100, - // 不支持 offset - }; - return request( - 'POST', - `https://music.163.com/api/djradio/toplist/pay`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/dj_toplist_popular.js b/netease_api/module/dj_toplist_popular.js deleted file mode 100644 index bb1fbe0..0000000 --- a/netease_api/module/dj_toplist_popular.js +++ /dev/null @@ -1,14 +0,0 @@ -// 电台最热主播榜 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 100, - // 不支持 offset - }; - return request('POST', `https://music.163.com/api/dj/toplist/popular`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/event.js b/netease_api/module/event.js deleted file mode 100644 index 2c32bc1..0000000 --- a/netease_api/module/event.js +++ /dev/null @@ -1,14 +0,0 @@ -// 动态 - -module.exports = (query, request) => { - const data = { - pagesize: query.pagesize || 20, - lasttime: query.lasttime || -1, - }; - return request('POST', `https://music.163.com/weapi/v1/event/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/event_del.js b/netease_api/module/event_del.js deleted file mode 100644 index c5b245f..0000000 --- a/netease_api/module/event_del.js +++ /dev/null @@ -1,13 +0,0 @@ -// 删除动态 - -module.exports = (query, request) => { - const data = { - id: query.evId, - }; - return request('POST', `https://music.163.com/eapi/event/delete`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/event_forward.js b/netease_api/module/event_forward.js deleted file mode 100644 index 77738b2..0000000 --- a/netease_api/module/event_forward.js +++ /dev/null @@ -1,16 +0,0 @@ -// 转发动态 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - forwards: query.forwards, - id: query.evId, - eventUserId: query.uid, - }; - return request('POST', `https://music.163.com/weapi/event/forward`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/fm_trash.js b/netease_api/module/fm_trash.js deleted file mode 100644 index eabd938..0000000 --- a/netease_api/module/fm_trash.js +++ /dev/null @@ -1,20 +0,0 @@ -// 垃圾桶 - -module.exports = (query, request) => { - const data = { - songId: query.id, - }; - return request( - 'POST', - `https://music.163.com/weapi/radio/trash/add?alg=RT&songId=${ - query.id - }&time=${query.time || 25}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/follow.js b/netease_api/module/follow.js deleted file mode 100644 index 293bd8a..0000000 --- a/netease_api/module/follow.js +++ /dev/null @@ -1,17 +0,0 @@ -// 关注与取消关注用户 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - query.t = query.t == 1 ? 'follow' : 'delfollow'; - return request( - 'POST', - `https://music.163.com/weapi/user/${query.t}/${query.id}`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/history_recommend_songs.js b/netease_api/module/history_recommend_songs.js deleted file mode 100644 index 89cb904..0000000 --- a/netease_api/module/history_recommend_songs.js +++ /dev/null @@ -1,17 +0,0 @@ -// 历史每日推荐歌曲 - -module.exports = (query, request) => { - query.cookie.os = 'ios'; - const data = {}; - return request( - 'POST', - `https://music.163.com/api/discovery/recommend/songs/history/recent`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/history_recommend_songs_detail.js b/netease_api/module/history_recommend_songs_detail.js deleted file mode 100644 index c981b28..0000000 --- a/netease_api/module/history_recommend_songs_detail.js +++ /dev/null @@ -1,19 +0,0 @@ -// 历史每日推荐歌曲详情 - -module.exports = (query, request) => { - query.cookie.os = 'ios'; - const data = { - date: query.date || '', - }; - return request( - 'POST', - `https://music.163.com/api/discovery/recommend/songs/history/detail`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/homepage_block_page.js b/netease_api/module/homepage_block_page.js deleted file mode 100644 index 2f49d75..0000000 --- a/netease_api/module/homepage_block_page.js +++ /dev/null @@ -1,17 +0,0 @@ -// 首页-发现 block page -// 这个接口为移动端接口,首页-发现页,数据结构可以参考 https://github.com/hcanyz/flutter-netease-music-api/blob/master/lib/src/api/uncategorized/bean.dart#L259 HomeBlockPageWrap -// query.refresh 是否刷新数据 -module.exports = (query, request) => { - const data = { refresh: query.refresh || true }; - return request( - 'POST', - `https://music.163.com/api/homepage/block/page`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/homepage_dragon_ball.js b/netease_api/module/homepage_dragon_ball.js deleted file mode 100644 index e048ac1..0000000 --- a/netease_api/module/homepage_dragon_ball.js +++ /dev/null @@ -1,19 +0,0 @@ -// 首页-发现 dragon ball -// 这个接口为移动端接口,首页-发现页(每日推荐、歌单、排行榜 那些入口) -// 数据结构可以参考 https://github.com/hcanyz/flutter-netease-music-api/blob/master/lib/src/api/uncategorized/bean.dart#L290 HomeDragonBallWrap -// !需要登录或者匿名登录,非登录返回 [] -module.exports = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/eapi/homepage/dragon/ball/static`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/homepage/dragon/ball/static', - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/hot_topic.js b/netease_api/module/hot_topic.js deleted file mode 100644 index 1fdbac1..0000000 --- a/netease_api/module/hot_topic.js +++ /dev/null @@ -1,14 +0,0 @@ -//热门话题 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 20, - offset: query.offset || 0, - }; - return request('POST', `https://music.163.com/weapi/act/hot`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/like.js b/netease_api/module/like.js deleted file mode 100644 index 7fd3e8f..0000000 --- a/netease_api/module/like.js +++ /dev/null @@ -1,23 +0,0 @@ -// 红心与取消红心歌曲 -const { toBoolean } = require('../util'); - -module.exports = (query, request) => { - query.like = query.like == 'false' ? false : true; - const data = { - trackId: query.id, - like: query.like, - }; - return request( - 'POST', - `https://music.163.com/weapi/radio/like?alg=${ - query.alg || 'itembased' - }&trackId=${query.id}&time=${query.time || 25}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/likelist.js b/netease_api/module/likelist.js deleted file mode 100644 index fcffede..0000000 --- a/netease_api/module/likelist.js +++ /dev/null @@ -1,13 +0,0 @@ -// 喜欢的歌曲(无序) - -module.exports = (query, request) => { - const data = { - uid: query.uid, - }; - return request('POST', `https://music.163.com/weapi/song/like/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/login.js b/netease_api/module/login.js deleted file mode 100644 index 72c9966..0000000 --- a/netease_api/module/login.js +++ /dev/null @@ -1,47 +0,0 @@ -// 邮箱登录 - -const crypto = require('crypto'); - -module.exports = async (query, request) => { - query.cookie.os = 'pc'; - const data = { - username: query.email, - password: - query.md5_password || - crypto.createHash('md5').update(query.password).digest('hex'), - rememberLogin: 'true', - }; - let result = await request( - 'POST', - `https://music.163.com/weapi/login`, - data, - { - crypto: 'weapi', - ua: 'pc', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - if (result.body.code === 502) { - return { - status: 200, - body: { - msg: '账号或密码错误', - code: 502, - message: '账号或密码错误', - }, - }; - } - if (result.body.code === 200) { - result = { - status: 200, - body: { - ...result.body, - cookie: result.cookie.join(';'), - }, - cookie: result.cookie, - }; - } - return result; -}; diff --git a/netease_api/module/login_cellphone.js b/netease_api/module/login_cellphone.js deleted file mode 100644 index 7f4398c..0000000 --- a/netease_api/module/login_cellphone.js +++ /dev/null @@ -1,39 +0,0 @@ -// 手机登录 - -const crypto = require('crypto'); - -module.exports = async (query, request) => { - query.cookie.os = 'pc'; - const data = { - phone: query.phone, - countrycode: query.countrycode || '86', - password: - query.md5_password || - crypto.createHash('md5').update(query.password).digest('hex'), - rememberLogin: 'true', - }; - let result = await request( - 'POST', - `https://music.163.com/weapi/login/cellphone`, - data, - { - crypto: 'weapi', - ua: 'pc', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - - if (result.body.code === 200) { - result = { - status: 200, - body: { - ...result.body, - cookie: result.cookie.join(';'), - }, - cookie: result.cookie, - }; - } - return result; -}; diff --git a/netease_api/module/login_refresh.js b/netease_api/module/login_refresh.js deleted file mode 100644 index 5a57ed4..0000000 --- a/netease_api/module/login_refresh.js +++ /dev/null @@ -1,16 +0,0 @@ -// 登录刷新 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/login/token/refresh`, - {}, - { - crypto: 'weapi', - ua: 'pc', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/login_status.js b/netease_api/module/login_status.js deleted file mode 100644 index 9a06d68..0000000 --- a/netease_api/module/login_status.js +++ /dev/null @@ -1,23 +0,0 @@ -// 登录状态 - -module.exports = (query, request) => { - return request( - 'GET', - `https://music.163.com`, - {}, - { cookie: query.cookie, proxy: query.proxy, realIP: query.realIP }, - ).then((response) => { - try { - let profile = eval(`(${/GUser\s*=\s*([^;]+);/.exec(response.body)[1]})`); - let bindings = eval( - `(${/GBinds\s*=\s*([^;]+);/.exec(response.body)[1]})`, - ); - response.body = { code: 200, profile: profile, bindings: bindings }; - return response; - } catch (err) { - response.status = 301; - response.body = { code: 301 }; - return Promise.reject(response); - } - }); -}; diff --git a/netease_api/module/logout.js b/netease_api/module/logout.js deleted file mode 100644 index 2eb97cd..0000000 --- a/netease_api/module/logout.js +++ /dev/null @@ -1,16 +0,0 @@ -// 退出登录 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/logout`, - {}, - { - crypto: 'weapi', - ua: 'pc', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/lyric.js b/netease_api/module/lyric.js deleted file mode 100644 index c217c13..0000000 --- a/netease_api/module/lyric.js +++ /dev/null @@ -1,17 +0,0 @@ -// 歌词 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - id: query.id, - lv: -1, - kv: -1, - tv: -1, - }; - return request('POST', `https://music.163.com/api/song/lyric`, data, { - crypto: 'linuxapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/msg_comments.js b/netease_api/module/msg_comments.js deleted file mode 100644 index a200eae..0000000 --- a/netease_api/module/msg_comments.js +++ /dev/null @@ -1,22 +0,0 @@ -// 评论 - -module.exports = (query, request) => { - const data = { - beforeTime: query.before || '-1', - limit: query.limit || 30, - total: 'true', - uid: query.uid, - }; - - return request( - 'POST', - `https://music.163.com/api/v1/user/comments/${query.uid}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/msg_forwards.js b/netease_api/module/msg_forwards.js deleted file mode 100644 index 7b540e9..0000000 --- a/netease_api/module/msg_forwards.js +++ /dev/null @@ -1,15 +0,0 @@ -// @我 - -module.exports = (query, request) => { - const data = { - offset: query.offset || 0, - limit: query.limit || 30, - total: 'true', - }; - return request('POST', `https://music.163.com/api/forwards/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/msg_notices.js b/netease_api/module/msg_notices.js deleted file mode 100644 index dbb82f8..0000000 --- a/netease_api/module/msg_notices.js +++ /dev/null @@ -1,14 +0,0 @@ -// 通知 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 30, - time: query.lasttime || -1, - }; - return request('POST', `https://music.163.com/api/msg/notices`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/msg_private.js b/netease_api/module/msg_private.js deleted file mode 100644 index 777356c..0000000 --- a/netease_api/module/msg_private.js +++ /dev/null @@ -1,15 +0,0 @@ -// 私信 - -module.exports = (query, request) => { - const data = { - offset: query.offset || 0, - limit: query.limit || 30, - total: 'true', - }; - return request('POST', `https://music.163.com/api/msg/private/users`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/msg_private_history.js b/netease_api/module/msg_private_history.js deleted file mode 100644 index c5e8421..0000000 --- a/netease_api/module/msg_private_history.js +++ /dev/null @@ -1,21 +0,0 @@ -// 私信内容 - -module.exports = (query, request) => { - const data = { - userId: query.uid, - limit: query.limit || 30, - time: query.before || 0, - total: 'true', - }; - return request( - 'POST', - `https://music.163.com/api/msg/private/history`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/mv_all.js b/netease_api/module/mv_all.js deleted file mode 100644 index 93ab80c..0000000 --- a/netease_api/module/mv_all.js +++ /dev/null @@ -1,20 +0,0 @@ -// 全部MV - -module.exports = (query, request) => { - const data = { - tags: JSON.stringify({ - 地区: query.area || '全部', - 类型: query.type || '全部', - 排序: query.order || '上升最快', - }), - offset: query.offset || 0, - total: 'true', - limit: query.limit || 30, - }; - return request('POST', `https://interface.music.163.com/api/mv/all`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/mv_detail.js b/netease_api/module/mv_detail.js deleted file mode 100644 index f5c890c..0000000 --- a/netease_api/module/mv_detail.js +++ /dev/null @@ -1,13 +0,0 @@ -// MV详情 - -module.exports = (query, request) => { - const data = { - id: query.mvid, - }; - return request('POST', `https://music.163.com/api/v1/mv/detail`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/mv_detail_info.js b/netease_api/module/mv_detail_info.js deleted file mode 100644 index 5e9ee75..0000000 --- a/netease_api/module/mv_detail_info.js +++ /dev/null @@ -1,19 +0,0 @@ -// MV 点赞转发评论数数据 - -module.exports = (query, request) => { - const data = { - threadid: `R_MV_5_${query.mvid}`, - composeliked: true, - }; - return request( - 'POST', - `https://music.163.com/api/comment/commentthread/info`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/mv_exclusive_rcmd.js b/netease_api/module/mv_exclusive_rcmd.js deleted file mode 100644 index 8856357..0000000 --- a/netease_api/module/mv_exclusive_rcmd.js +++ /dev/null @@ -1,19 +0,0 @@ -// 网易出品 - -module.exports = (query, request) => { - const data = { - offset: query.offset || 0, - limit: query.limit || 30, - }; - return request( - 'POST', - `https://interface.music.163.com/api/mv/exclusive/rcmd`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/mv_first.js b/netease_api/module/mv_first.js deleted file mode 100644 index 554569d..0000000 --- a/netease_api/module/mv_first.js +++ /dev/null @@ -1,21 +0,0 @@ -// 最新MV - -module.exports = (query, request) => { - const data = { - // 'offset': query.offset || 0, - area: query.area || '', - limit: query.limit || 30, - total: true, - }; - return request( - 'POST', - `https://interface.music.163.com/weapi/mv/first`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/mv_sub.js b/netease_api/module/mv_sub.js deleted file mode 100644 index de9459d..0000000 --- a/netease_api/module/mv_sub.js +++ /dev/null @@ -1,15 +0,0 @@ -// 收藏与取消收藏MV - -module.exports = (query, request) => { - query.t = query.t == 1 ? 'sub' : 'unsub'; - const data = { - mvId: query.mvid, - mvIds: '["' + query.mvid + '"]', - }; - return request('POST', `https://music.163.com/weapi/mv/${query.t}`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/mv_sublist.js b/netease_api/module/mv_sublist.js deleted file mode 100644 index 0da033c..0000000 --- a/netease_api/module/mv_sublist.js +++ /dev/null @@ -1,20 +0,0 @@ -// 已收藏MV列表 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 25, - offset: query.offset || 0, - total: true, - }; - return request( - 'POST', - `https://music.163.com/weapi/cloudvideo/allvideo/sublist`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/mv_url.js b/netease_api/module/mv_url.js deleted file mode 100644 index cd5e91a..0000000 --- a/netease_api/module/mv_url.js +++ /dev/null @@ -1,19 +0,0 @@ -// MV链接 - -module.exports = (query, request) => { - const data = { - id: query.id, - r: query.r || 1080, - }; - return request( - 'POST', - `https://music.163.com/weapi/song/enhance/play/mv/url`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/personal_fm.js b/netease_api/module/personal_fm.js deleted file mode 100644 index 8197694..0000000 --- a/netease_api/module/personal_fm.js +++ /dev/null @@ -1,15 +0,0 @@ -// 私人FM - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/v1/radio/get`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/personalized.js b/netease_api/module/personalized.js deleted file mode 100644 index 45c1639..0000000 --- a/netease_api/module/personalized.js +++ /dev/null @@ -1,21 +0,0 @@ -// 推荐歌单 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 30, - // offset: query.offset || 0, - total: true, - n: 1000, - }; - return request( - 'POST', - `https://music.163.com/weapi/personalized/playlist`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/personalized_djprogram.js b/netease_api/module/personalized_djprogram.js deleted file mode 100644 index 232fa78..0000000 --- a/netease_api/module/personalized_djprogram.js +++ /dev/null @@ -1,15 +0,0 @@ -// 推荐电台 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/personalized/djprogram`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/personalized_mv.js b/netease_api/module/personalized_mv.js deleted file mode 100644 index 1d0e4e6..0000000 --- a/netease_api/module/personalized_mv.js +++ /dev/null @@ -1,15 +0,0 @@ -// 推荐MV - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/personalized/mv`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/personalized_newsong.js b/netease_api/module/personalized_newsong.js deleted file mode 100644 index de275a9..0000000 --- a/netease_api/module/personalized_newsong.js +++ /dev/null @@ -1,20 +0,0 @@ -// 推荐新歌 - -module.exports = (query, request) => { - const data = { - type: 'recommend', - limit: query.limit || 10, - areaId: query.areaId || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/personalized/newsong`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/personalized_privatecontent.js b/netease_api/module/personalized_privatecontent.js deleted file mode 100644 index ac2c228..0000000 --- a/netease_api/module/personalized_privatecontent.js +++ /dev/null @@ -1,15 +0,0 @@ -// 独家放送 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/personalized/privatecontent`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/personalized_privatecontent_list.js b/netease_api/module/personalized_privatecontent_list.js deleted file mode 100644 index d98f409..0000000 --- a/netease_api/module/personalized_privatecontent_list.js +++ /dev/null @@ -1,20 +0,0 @@ -// 独家放送列表 - -module.exports = (query, request) => { - const data = { - offset: query.offset || 0, - total: 'true', - limit: query.limit || 60, - }; - return request( - 'POST', - `https://music.163.com/api/v2/privatecontent/list`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/playlist_catlist.js b/netease_api/module/playlist_catlist.js deleted file mode 100644 index def3039..0000000 --- a/netease_api/module/playlist_catlist.js +++ /dev/null @@ -1,15 +0,0 @@ -// 全部歌单分类 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/playlist/catalogue`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/playlist_cover_update.js b/netease_api/module/playlist_cover_update.js deleted file mode 100644 index 4e2d412..0000000 --- a/netease_api/module/playlist_cover_update.js +++ /dev/null @@ -1,28 +0,0 @@ -const uploadPlugin = require('../plugins/upload'); -module.exports = async (query, request) => { - const uploadInfo = await uploadPlugin(query, request); - const res = await request( - 'POST', - `https://music.163.com/weapi/playlist/cover/update`, - { - id: query.id, - coverImgId: uploadInfo.imgId, - }, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - return { - status: 200, - body: { - code: 200, - data: { - ...uploadInfo, - ...res.body, - }, - }, - }; -}; diff --git a/netease_api/module/playlist_create.js b/netease_api/module/playlist_create.js deleted file mode 100644 index 42f3e82..0000000 --- a/netease_api/module/playlist_create.js +++ /dev/null @@ -1,16 +0,0 @@ -// 创建歌单 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - name: query.name, - privacy: query.privacy, //0 为普通歌单,10 为隐私歌单 - type: query.type || 'NORMAL', // NORMAL|VIDEO - }; - return request('POST', `https://music.163.com/api/playlist/create`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/playlist_delete.js b/netease_api/module/playlist_delete.js deleted file mode 100644 index 2fe9327..0000000 --- a/netease_api/module/playlist_delete.js +++ /dev/null @@ -1,14 +0,0 @@ -// 删除歌单 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - ids: '[' + query.id + ']', - }; - return request('POST', `https://music.163.com/weapi/playlist/remove`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/playlist_desc_update.js b/netease_api/module/playlist_desc_update.js deleted file mode 100644 index 55fada2..0000000 --- a/netease_api/module/playlist_desc_update.js +++ /dev/null @@ -1,20 +0,0 @@ -// 更新歌单描述 - -module.exports = (query, request) => { - const data = { - id: query.id, - desc: query.desc, - }; - return request( - 'POST', - `https://interface3.music.163.com/eapi/playlist/desc/update`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/playlist/desc/update', - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/playlist_detail.js b/netease_api/module/playlist_detail.js deleted file mode 100644 index ccd09b1..0000000 --- a/netease_api/module/playlist_detail.js +++ /dev/null @@ -1,15 +0,0 @@ -// 歌单详情 - -module.exports = (query, request) => { - const data = { - id: query.id, - n: 100000, - s: query.s || 8, - }; - return request('POST', `https://music.163.com/api/v6/playlist/detail`, data, { - crypto: 'linuxapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/playlist_highquality_tags.js b/netease_api/module/playlist_highquality_tags.js deleted file mode 100644 index d6be7c7..0000000 --- a/netease_api/module/playlist_highquality_tags.js +++ /dev/null @@ -1,15 +0,0 @@ -// 精品歌单 tags -module.exports = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/playlist/highquality/tags`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/playlist_hot.js b/netease_api/module/playlist_hot.js deleted file mode 100644 index fd588f6..0000000 --- a/netease_api/module/playlist_hot.js +++ /dev/null @@ -1,15 +0,0 @@ -// 热门歌单分类 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/playlist/hottags`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/playlist_mylike.js b/netease_api/module/playlist_mylike.js deleted file mode 100644 index b96d034..0000000 --- a/netease_api/module/playlist_mylike.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = (query, request) => { - const data = { - time: query.time || '-1', - limit: query.limit || '12', - }; - return request( - 'POST', - `https://music.163.com/api/mlog/playlist/mylike/bytime/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/playlist_name_update.js b/netease_api/module/playlist_name_update.js deleted file mode 100644 index 5f4dfbd..0000000 --- a/netease_api/module/playlist_name_update.js +++ /dev/null @@ -1,20 +0,0 @@ -// 更新歌单名 - -module.exports = (query, request) => { - const data = { - id: query.id, - name: query.name, - }; - return request( - 'POST', - `https://interface3.music.163.com/eapi/playlist/update/name`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/playlist/update/name', - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/playlist_order_update.js b/netease_api/module/playlist_order_update.js deleted file mode 100644 index 570cd13..0000000 --- a/netease_api/module/playlist_order_update.js +++ /dev/null @@ -1,19 +0,0 @@ -// 编辑歌单顺序 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - ids: query.ids, - }; - return request( - 'POST', - `https://music.163.com/api/playlist/order/update`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/playlist_subscribe.js b/netease_api/module/playlist_subscribe.js deleted file mode 100644 index 31d56e9..0000000 --- a/netease_api/module/playlist_subscribe.js +++ /dev/null @@ -1,19 +0,0 @@ -// 收藏与取消收藏歌单 - -module.exports = (query, request) => { - query.t = query.t == 1 ? 'subscribe' : 'unsubscribe'; - const data = { - id: query.id, - }; - return request( - 'POST', - `https://music.163.com/weapi/playlist/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/playlist_subscribers.js b/netease_api/module/playlist_subscribers.js deleted file mode 100644 index 0fa2764..0000000 --- a/netease_api/module/playlist_subscribers.js +++ /dev/null @@ -1,20 +0,0 @@ -// 歌单收藏者 - -module.exports = (query, request) => { - const data = { - id: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/playlist/subscribers`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/playlist_tags_update.js b/netease_api/module/playlist_tags_update.js deleted file mode 100644 index fa3fb3c..0000000 --- a/netease_api/module/playlist_tags_update.js +++ /dev/null @@ -1,20 +0,0 @@ -// 更新歌单标签 - -module.exports = (query, request) => { - const data = { - id: query.id, - tags: query.tags, - }; - return request( - 'POST', - `https://interface3.music.163.com/eapi/playlist/tags/update`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/playlist/tags/update', - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/playlist_track_add.js b/netease_api/module/playlist_track_add.js deleted file mode 100644 index 7daaa74..0000000 --- a/netease_api/module/playlist_track_add.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = async (query, request) => { - query.cookie.os = 'pc'; - query.ids = query.ids || ''; - const data = { - id: query.pid, - tracks: JSON.stringify( - query.ids.split(',').map((item) => { - return { type: 3, id: item }; - }), - ), - }; - console.log(data); - - return request('POST', `https://music.163.com/api/playlist/track/add`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/playlist_track_delete.js b/netease_api/module/playlist_track_delete.js deleted file mode 100644 index ae096e2..0000000 --- a/netease_api/module/playlist_track_delete.js +++ /dev/null @@ -1,26 +0,0 @@ -// 收藏单曲到歌单 从歌单删除歌曲 - -module.exports = async (query, request) => { - query.cookie.os = 'pc'; - query.ids = query.ids || ''; - const data = { - id: query.id, - tracks: JSON.stringify( - query.ids.split(',').map((item) => { - return { type: 3, id: item }; - }), - ), - }; - - return request( - 'POST', - `https://music.163.com/api/playlist/track/delete`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/playlist_tracks.js b/netease_api/module/playlist_tracks.js deleted file mode 100644 index 45a0627..0000000 --- a/netease_api/module/playlist_tracks.js +++ /dev/null @@ -1,51 +0,0 @@ -// 收藏单曲到歌单 从歌单删除歌曲 - -module.exports = async (query, request) => { - query.cookie.os = 'pc'; - const tracks = query.tracks.split(','); - const data = { - op: query.op, // del,add - pid: query.pid, // 歌单id - trackIds: JSON.stringify(tracks), // 歌曲id - imme: 'true', - }; - - try { - const res = await request( - 'POST', - `https://music.163.com/api/playlist/manipulate/tracks`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - return { - status: 200, - body: { - ...res, - }, - }; - } catch (error) { - if (error.body.code === 512) { - return request( - 'POST', - `https://music.163.com/api/playlist/manipulate/tracks`, - { - op: query.op, // del,add - pid: query.pid, // 歌单id - trackIds: JSON.stringify([...tracks, ...tracks]), - imme: 'true', - }, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - } - } -}; diff --git a/netease_api/module/playlist_update.js b/netease_api/module/playlist_update.js deleted file mode 100644 index e55a527..0000000 --- a/netease_api/module/playlist_update.js +++ /dev/null @@ -1,18 +0,0 @@ -// 编辑歌单 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - query.desc = query.desc || ''; - query.tags = query.tags || ''; - const data = { - '/api/playlist/desc/update': `{"id":${query.id},"desc":"${query.desc}"}`, - '/api/playlist/tags/update': `{"id":${query.id},"tags":"${query.tags}"}`, - '/api/playlist/update/name': `{"id":${query.id},"name":"${query.name}"}`, - }; - return request('POST', `https://music.163.com/weapi/batch`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/playlist_video_recent.js b/netease_api/module/playlist_video_recent.js deleted file mode 100644 index e29acbe..0000000 --- a/netease_api/module/playlist_video_recent.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/playlist/video/recent`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/playmode_intelligence_list.js b/netease_api/module/playmode_intelligence_list.js deleted file mode 100644 index 3a0c2fa..0000000 --- a/netease_api/module/playmode_intelligence_list.js +++ /dev/null @@ -1,22 +0,0 @@ -// 智能播放 - -module.exports = (query, request) => { - const data = { - songId: query.id, - type: 'fromPlayOne', - playlistId: query.pid, - startMusicId: query.sid || query.id, - count: query.count || 1, - }; - return request( - 'POST', - `https://music.163.com/weapi/playmode/intelligence/list`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/program_recommend.js b/netease_api/module/program_recommend.js deleted file mode 100644 index 56e63e7..0000000 --- a/netease_api/module/program_recommend.js +++ /dev/null @@ -1,20 +0,0 @@ -// 推荐节目 - -module.exports = (query, request) => { - const data = { - cateId: query.type, - limit: query.limit || 10, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/program/recommend/v1`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/rebind.js b/netease_api/module/rebind.js deleted file mode 100644 index 6d615be..0000000 --- a/netease_api/module/rebind.js +++ /dev/null @@ -1,21 +0,0 @@ -// 更换手机 - -module.exports = (query, request) => { - const data = { - captcha: query.captcha, - phone: query.phone, - oldcaptcha: query.oldcaptcha, - ctcode: query.ctcode || '86', - }; - return request( - 'POST', - `https://music.163.com/api/user/replaceCellphone`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/recommend_resource.js b/netease_api/module/recommend_resource.js deleted file mode 100644 index 786194b..0000000 --- a/netease_api/module/recommend_resource.js +++ /dev/null @@ -1,15 +0,0 @@ -// 每日推荐歌单 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/v1/discovery/recommend/resource`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/recommend_songs.js b/netease_api/module/recommend_songs.js deleted file mode 100644 index 519e70c..0000000 --- a/netease_api/module/recommend_songs.js +++ /dev/null @@ -1,17 +0,0 @@ -// 每日推荐歌曲 - -module.exports = (query, request) => { - query.cookie.os = 'ios'; - const data = {}; - return request( - 'POST', - `https://music.163.com/api/v3/discovery/recommend/songs`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/register_cellphone.js b/netease_api/module/register_cellphone.js deleted file mode 100644 index fb09fb4..0000000 --- a/netease_api/module/register_cellphone.js +++ /dev/null @@ -1,18 +0,0 @@ -// 注册账号 -const crypto = require('crypto'); - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - captcha: query.captcha, - phone: query.phone, - password: crypto.createHash('md5').update(query.password).digest('hex'), - nickname: query.nickname, - }; - return request('POST', `https://music.163.com/api/register/cellphone`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/related_allvideo.js b/netease_api/module/related_allvideo.js deleted file mode 100644 index 7655ac1..0000000 --- a/netease_api/module/related_allvideo.js +++ /dev/null @@ -1,19 +0,0 @@ -// 相关视频 - -module.exports = (query, request) => { - const data = { - id: query.id, - type: /^\d+$/.test(query.id) ? 0 : 1, - }; - return request( - 'POST', - `https://music.163.com/weapi/cloudvideo/v1/allvideo/rcmd`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/related_playlist.js b/netease_api/module/related_playlist.js deleted file mode 100644 index c553837..0000000 --- a/netease_api/module/related_playlist.js +++ /dev/null @@ -1,38 +0,0 @@ -// 相关歌单 - -module.exports = (query, request) => { - return request( - 'GET', - `https://music.163.com/playlist?id=${query.id}`, - {}, - { - ua: 'pc', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ).then((response) => { - try { - const pattern = /
[\s\S]*?[\s\S]*?]*>([^<]+?)<\/a>[\s\S]*?]*>([^<]+?)<\/a>/g; - let result, - playlists = []; - while ((result = pattern.exec(response.body)) != null) { - playlists.push({ - creator: { - userId: result[4].slice('/user/home?id='.length), - nickname: result[5], - }, - coverImgUrl: result[1].slice(0, -'?param=50y50'.length), - name: result[3], - id: result[2].slice('/playlist?id='.length), - }); - } - response.body = { code: 200, playlists: playlists }; - return response; - } catch (err) { - response.status = 500; - response.body = { code: 500, msg: err.stack }; - return Promise.reject(response); - } - }); -}; diff --git a/netease_api/module/resource_like.js b/netease_api/module/resource_like.js deleted file mode 100644 index 3d289ba..0000000 --- a/netease_api/module/resource_like.js +++ /dev/null @@ -1,29 +0,0 @@ -// 点赞与取消点赞资源 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - query.t = query.t == 1 ? 'like' : 'unlike'; - query.type = { - 1: 'R_MV_5_', // MV - 4: 'A_DJ_1_', // 电台 - 5: 'R_VI_62_', // 视频 - 6: 'A_EV_2_', - }[query.type]; - const data = { - threadId: query.type + query.id, - }; - if (query.type === 'A_EV_2_') { - data.threadId = query.threadId; - } - return request( - 'POST', - `https://music.163.com/weapi/resource/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/scrobble.js b/netease_api/module/scrobble.js deleted file mode 100644 index 5b6d3e7..0000000 --- a/netease_api/module/scrobble.js +++ /dev/null @@ -1,27 +0,0 @@ -// 听歌打卡 - -module.exports = (query, request) => { - const data = { - logs: JSON.stringify([ - { - action: 'play', - json: { - download: 0, - end: 'playend', - id: query.id, - sourceId: query.sourceid, - time: query.time, - type: 'song', - wifi: 0, - }, - }, - ]), - }; - - return request('POST', `https://music.163.com/weapi/feedback/weblog`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/search.js b/netease_api/module/search.js deleted file mode 100644 index 471d781..0000000 --- a/netease_api/module/search.js +++ /dev/null @@ -1,16 +0,0 @@ -// 搜索 - -module.exports = (query, request) => { - const data = { - s: query.keywords, - type: query.type || 1, // 1: 单曲, 10: 专辑, 100: 歌手, 1000: 歌单, 1002: 用户, 1004: MV, 1006: 歌词, 1009: 电台, 1014: 视频 - limit: query.limit || 30, - offset: query.offset || 0, - }; - return request('POST', `https://music.163.com/weapi/search/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/search_default.js b/netease_api/module/search_default.js deleted file mode 100644 index c231d18..0000000 --- a/netease_api/module/search_default.js +++ /dev/null @@ -1,16 +0,0 @@ -// 默认搜索关键词 - -module.exports = (query, request) => { - return request( - 'POST', - `https://interface3.music.163.com/eapi/search/defaultkeyword/get`, - {}, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/search/defaultkeyword/get', - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/search_hot.js b/netease_api/module/search_hot.js deleted file mode 100644 index dd6b6d4..0000000 --- a/netease_api/module/search_hot.js +++ /dev/null @@ -1,14 +0,0 @@ -// 热门搜索 - -module.exports = (query, request) => { - const data = { - type: 1111, - }; - return request('POST', `https://music.163.com/weapi/search/hot`, data, { - crypto: 'weapi', - ua: 'mobile', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/search_hot_detail.js b/netease_api/module/search_hot_detail.js deleted file mode 100644 index 3e869da..0000000 --- a/netease_api/module/search_hot_detail.js +++ /dev/null @@ -1,15 +0,0 @@ -// 热搜列表 -module.exports = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/weapi/hotsearchlist/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/search_multimatch.js b/netease_api/module/search_multimatch.js deleted file mode 100644 index 6777178..0000000 --- a/netease_api/module/search_multimatch.js +++ /dev/null @@ -1,19 +0,0 @@ -// 多类型搜索 - -module.exports = (query, request) => { - const data = { - type: query.type || 1, - s: query.keywords || '', - }; - return request( - 'POST', - `https://music.163.com/weapi/search/suggest/multimatch`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/search_suggest.js b/netease_api/module/search_suggest.js deleted file mode 100644 index 6e6b9cc..0000000 --- a/netease_api/module/search_suggest.js +++ /dev/null @@ -1,19 +0,0 @@ -// 搜索建议 - -module.exports = (query, request) => { - const data = { - s: query.keywords || '', - }; - let type = query.type == 'mobile' ? 'keyword' : 'web'; - return request( - 'POST', - `https://music.163.com/weapi/search/suggest/` + type, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/send_playlist.js b/netease_api/module/send_playlist.js deleted file mode 100644 index 15e9238..0000000 --- a/netease_api/module/send_playlist.js +++ /dev/null @@ -1,17 +0,0 @@ -// 私信歌单 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - id: query.playlist, - type: 'playlist', - msg: query.msg, - userIds: '[' + query.user_ids + ']', - }; - return request('POST', `https://music.163.com/weapi/msg/private/send`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/send_text.js b/netease_api/module/send_text.js deleted file mode 100644 index 72285d6..0000000 --- a/netease_api/module/send_text.js +++ /dev/null @@ -1,16 +0,0 @@ -// 私信 - -module.exports = (query, request) => { - query.cookie.os = 'pc'; - const data = { - type: 'text', - msg: query.msg, - userIds: '[' + query.user_ids + ']', - }; - return request('POST', `https://music.163.com/weapi/msg/private/send`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/setting.js b/netease_api/module/setting.js deleted file mode 100644 index d26ced6..0000000 --- a/netease_api/module/setting.js +++ /dev/null @@ -1,11 +0,0 @@ -// 设置 - -module.exports = (query, request) => { - const data = {}; - return request('POST', `https://music.163.com/api/user/setting`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/share_resource.js b/netease_api/module/share_resource.js deleted file mode 100644 index cd8a3d0..0000000 --- a/netease_api/module/share_resource.js +++ /dev/null @@ -1,20 +0,0 @@ -// 分享歌曲到动态 - -module.exports = (query, request) => { - const data = { - type: query.type || 'song', // song,playlist,mv,djprogram,djradio - msg: query.msg || '', - id: query.id || '', - }; - return request( - 'POST', - `https://music.163.com/weapi/share/friends/resource`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/simi_artist.js b/netease_api/module/simi_artist.js deleted file mode 100644 index 3c079a8..0000000 --- a/netease_api/module/simi_artist.js +++ /dev/null @@ -1,18 +0,0 @@ -// 相似歌手 - -module.exports = (query, request) => { - const data = { - artistid: query.id, - }; - return request( - 'POST', - `https://music.163.com/weapi/discovery/simiArtist`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/simi_mv.js b/netease_api/module/simi_mv.js deleted file mode 100644 index bdf76a5..0000000 --- a/netease_api/module/simi_mv.js +++ /dev/null @@ -1,13 +0,0 @@ -// 相似MV - -module.exports = (query, request) => { - const data = { - mvid: query.mvid, - }; - return request('POST', `https://music.163.com/weapi/discovery/simiMV`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/simi_playlist.js b/netease_api/module/simi_playlist.js deleted file mode 100644 index dbb6bce..0000000 --- a/netease_api/module/simi_playlist.js +++ /dev/null @@ -1,20 +0,0 @@ -// 相似歌单 - -module.exports = (query, request) => { - const data = { - songid: query.id, - limit: query.limit || 50, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/discovery/simiPlaylist`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/simi_song.js b/netease_api/module/simi_song.js deleted file mode 100644 index 9cc1c4a..0000000 --- a/netease_api/module/simi_song.js +++ /dev/null @@ -1,20 +0,0 @@ -// 相似歌曲 - -module.exports = (query, request) => { - const data = { - songid: query.id, - limit: query.limit || 50, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/discovery/simiSong`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/simi_user.js b/netease_api/module/simi_user.js deleted file mode 100644 index 607277b..0000000 --- a/netease_api/module/simi_user.js +++ /dev/null @@ -1,20 +0,0 @@ -// 相似用户 - -module.exports = (query, request) => { - const data = { - songid: query.id, - limit: query.limit || 50, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/discovery/simiUser`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/song_detail.js b/netease_api/module/song_detail.js deleted file mode 100644 index 92c72ef..0000000 --- a/netease_api/module/song_detail.js +++ /dev/null @@ -1,15 +0,0 @@ -// 歌曲详情 - -module.exports = (query, request) => { - query.ids = query.ids.split(/\s*,\s*/); - const data = { - c: '[' + query.ids.map((id) => '{"id":' + id + '}').join(',') + ']', - ids: '[' + query.ids.join(',') + ']', - }; - return request('POST', `https://music.163.com/weapi/v3/song/detail`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/song_order_update.js b/netease_api/module/song_order_update.js deleted file mode 100644 index 3fb6c8a..0000000 --- a/netease_api/module/song_order_update.js +++ /dev/null @@ -1,22 +0,0 @@ -// 更新歌曲顺序 - -module.exports = (query, request) => { - const data = { - pid: query.pid, - trackIds: query.ids, - op: 'update', - }; - - return request( - 'POST', - `http://interface.music.163.com/api/playlist/manipulate/tracks`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/playlist/desc/update', - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/song_url.js b/netease_api/module/song_url.js deleted file mode 100644 index e2a55ae..0000000 --- a/netease_api/module/song_url.js +++ /dev/null @@ -1,25 +0,0 @@ -// 歌曲链接 - -const crypto = require('crypto'); - -module.exports = (query, request) => { - if (!('MUSIC_U' in query.cookie)) - query.cookie._ntes_nuid = crypto.randomBytes(16).toString('hex'); - query.cookie.os = 'pc'; - const data = { - ids: '[' + query.id + ']', - br: parseInt(query.br || 999000), - }; - return request( - 'POST', - `https://interface3.music.163.com/eapi/song/enhance/player/url`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - url: '/api/song/enhance/player/url', - }, - ); -}; diff --git a/netease_api/module/top_album.js b/netease_api/module/top_album.js deleted file mode 100644 index 2812f72..0000000 --- a/netease_api/module/top_album.js +++ /dev/null @@ -1,27 +0,0 @@ -// 新碟上架 - -module.exports = (query, request) => { - const date = new Date(); - - const data = { - area: query.area || 'ALL', // //ALL:全部,ZH:华语,EA:欧美,KR:韩国,JP:日本 - limit: query.limit || 50, - offset: query.offset || 0, - type: query.type || 'new', - year: query.year || date.getFullYear(), - month: query.month || date.getMonth() + 1, - total: false, - rcmd: true, - }; - return request( - 'POST', - `https://music.163.com/api/discovery/new/albums/area`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/top_artists.js b/netease_api/module/top_artists.js deleted file mode 100644 index bd3dbad..0000000 --- a/netease_api/module/top_artists.js +++ /dev/null @@ -1,15 +0,0 @@ -// 热门歌手 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 50, - offset: query.offset || 0, - total: true, - }; - return request('POST', `https://music.163.com/weapi/artist/top`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/top_list.js b/netease_api/module/top_list.js deleted file mode 100644 index 5ab262b..0000000 --- a/netease_api/module/top_list.js +++ /dev/null @@ -1,30 +0,0 @@ -// 排行榜 -module.exports = (query, request) => { - query.cookie.os = 'pc'; - if (query.idx) { - return Promise.resolve({ - status: 500, - body: { - code: 500, - msg: '不支持此方式调用,只支持id调用', - }, - }); - } - - const data = { - id: query.id, - n: '500', - s: '0', - }; - return request( - 'POST', - `https://interface3.music.163.com/api/playlist/v4/detail`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/top_mv.js b/netease_api/module/top_mv.js deleted file mode 100644 index 4c77888..0000000 --- a/netease_api/module/top_mv.js +++ /dev/null @@ -1,16 +0,0 @@ -// MV排行榜 - -module.exports = (query, request) => { - const data = { - area: query.area || '', - limit: query.limit || 30, - offset: query.offset || 0, - total: true, - }; - return request('POST', `https://music.163.com/weapi/mv/toplist`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/top_playlist.js b/netease_api/module/top_playlist.js deleted file mode 100644 index 7a2e5e0..0000000 --- a/netease_api/module/top_playlist.js +++ /dev/null @@ -1,17 +0,0 @@ -// 分类歌单 - -module.exports = (query, request) => { - const data = { - cat: query.cat || '全部', // 全部,华语,欧美,日语,韩语,粤语,小语种,流行,摇滚,民谣,电子,舞曲,说唱,轻音乐,爵士,乡村,R&B/Soul,古典,民族,英伦,金属,朋克,蓝调,雷鬼,世界音乐,拉丁,另类/独立,New Age,古风,后摇,Bossa Nova,清晨,夜晚,学习,工作,午休,下午茶,地铁,驾车,运动,旅行,散步,酒吧,怀旧,清新,浪漫,性感,伤感,治愈,放松,孤独,感动,兴奋,快乐,安静,思念,影视原声,ACG,儿童,校园,游戏,70后,80后,90后,网络歌曲,KTV,经典,翻唱,吉他,钢琴,器乐,榜单,00后 - order: query.order || 'hot', // hot,new - limit: query.limit || 50, - offset: query.offset || 0, - total: true, - }; - return request('POST', `https://music.163.com/weapi/playlist/list`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/top_playlist_highquality.js b/netease_api/module/top_playlist_highquality.js deleted file mode 100644 index 8eb5b88..0000000 --- a/netease_api/module/top_playlist_highquality.js +++ /dev/null @@ -1,21 +0,0 @@ -// 精品歌单 - -module.exports = (query, request) => { - const data = { - cat: query.cat || '全部', // 全部,华语,欧美,韩语,日语,粤语,小语种,运动,ACG,影视原声,流行,摇滚,后摇,古风,民谣,轻音乐,电子,器乐,说唱,古典,爵士 - limit: query.limit || 50, - lasttime: query.before || 0, // 歌单updateTime - total: true, - }; - return request( - 'POST', - `https://music.163.com/api/playlist/highquality/list`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/top_song.js b/netease_api/module/top_song.js deleted file mode 100644 index a6d7d54..0000000 --- a/netease_api/module/top_song.js +++ /dev/null @@ -1,21 +0,0 @@ -// 新歌速递 - -module.exports = (query, request) => { - const data = { - areaId: query.type || 0, // 全部:0 华语:7 欧美:96 日本:8 韩国:16 - // limit: query.limit || 100, - // offset: query.offset || 0, - total: true, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/discovery/new/songs`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/toplist.js b/netease_api/module/toplist.js deleted file mode 100644 index 9239ba4..0000000 --- a/netease_api/module/toplist.js +++ /dev/null @@ -1,15 +0,0 @@ -// 所有榜单介绍 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/api/toplist`, - {}, - { - crypto: 'linuxapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/toplist_artist.js b/netease_api/module/toplist_artist.js deleted file mode 100644 index 3a71147..0000000 --- a/netease_api/module/toplist_artist.js +++ /dev/null @@ -1,16 +0,0 @@ -// 歌手榜 - -module.exports = (query, request) => { - const data = { - type: query.type || 1, - limit: 100, - offset: 0, - total: true, - }; - return request('POST', `https://music.163.com/weapi/toplist/artist`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/toplist_detail.js b/netease_api/module/toplist_detail.js deleted file mode 100644 index e3e442f..0000000 --- a/netease_api/module/toplist_detail.js +++ /dev/null @@ -1,15 +0,0 @@ -// 所有榜单内容摘要 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/toplist/detail`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/user_account.js b/netease_api/module/user_account.js deleted file mode 100644 index f1bf505..0000000 --- a/netease_api/module/user_account.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = (query, request) => { - const data = {}; - return request('POST', `https://music.163.com/api/nuser/account/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/user_audio.js b/netease_api/module/user_audio.js deleted file mode 100644 index 43aa231..0000000 --- a/netease_api/module/user_audio.js +++ /dev/null @@ -1,18 +0,0 @@ -// 用户创建的电台 - -module.exports = (query, request) => { - const data = { - userId: query.uid, - }; - return request( - 'POST', - `https://music.163.com/weapi/djradio/get/byuser`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/user_binding.js b/netease_api/module/user_binding.js deleted file mode 100644 index 787984f..0000000 --- a/netease_api/module/user_binding.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/v1/user/bindings/${query.uid}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/user_cloud.js b/netease_api/module/user_cloud.js deleted file mode 100644 index 0f0aa8e..0000000 --- a/netease_api/module/user_cloud.js +++ /dev/null @@ -1,14 +0,0 @@ -// 云盘数据 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 30, - offset: query.offset || 0, - }; - return request('POST', `https://music.163.com/weapi/v1/cloud/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/user_cloud_del.js b/netease_api/module/user_cloud_del.js deleted file mode 100644 index ab42bfe..0000000 --- a/netease_api/module/user_cloud_del.js +++ /dev/null @@ -1,13 +0,0 @@ -// 云盘歌曲删除 - -module.exports = (query, request) => { - const data = { - songIds: [query.id], - }; - return request('POST', `https://music.163.com/weapi/cloud/del`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/user_cloud_detail.js b/netease_api/module/user_cloud_detail.js deleted file mode 100644 index c41ff80..0000000 --- a/netease_api/module/user_cloud_detail.js +++ /dev/null @@ -1,19 +0,0 @@ -// 云盘数据详情 - -module.exports = (query, request) => { - const id = query.id.replace(/\s/g, '').split(','); - const data = { - songIds: id, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/cloud/get/byids`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/user_detail.js b/netease_api/module/user_detail.js deleted file mode 100644 index be14276..0000000 --- a/netease_api/module/user_detail.js +++ /dev/null @@ -1,15 +0,0 @@ -// 用户详情 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/v1/user/detail/${query.uid}`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/user_dj.js b/netease_api/module/user_dj.js deleted file mode 100644 index 78f9c2a..0000000 --- a/netease_api/module/user_dj.js +++ /dev/null @@ -1,19 +0,0 @@ -// 用户电台节目 - -module.exports = (query, request) => { - const data = { - limit: query.limit || 30, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/dj/program/${query.uid}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/user_event.js b/netease_api/module/user_event.js deleted file mode 100644 index 35a287c..0000000 --- a/netease_api/module/user_event.js +++ /dev/null @@ -1,21 +0,0 @@ -// 用户动态 - -module.exports = (query, request) => { - const data = { - getcounts: true, - time: query.lasttime || -1, - limit: query.limit || 30, - total: false, - }; - return request( - 'POST', - `https://music.163.com/weapi/event/get/${query.uid}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/user_followeds.js b/netease_api/module/user_followeds.js deleted file mode 100644 index 14dc835..0000000 --- a/netease_api/module/user_followeds.js +++ /dev/null @@ -1,21 +0,0 @@ -// 关注TA的人(粉丝) - -module.exports = (query, request) => { - const data = { - userId: query.uid, - time: query.lasttime || -1, - limit: query.limit || 30, - }; - return request( - 'POST', - `https://music.163.com/eapi/user/getfolloweds/${query.uid}`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/user/getfolloweds', - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/user_follows.js b/netease_api/module/user_follows.js deleted file mode 100644 index 3e12a21..0000000 --- a/netease_api/module/user_follows.js +++ /dev/null @@ -1,20 +0,0 @@ -// TA关注的人(关注) - -module.exports = (query, request) => { - const data = { - offset: query.offset || 0, - limit: query.limit || 30, - order: true, - }; - return request( - 'POST', - `https://music.163.com/weapi/user/getfollows/${query.uid}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/user_level.js b/netease_api/module/user_level.js deleted file mode 100644 index 9eb9694..0000000 --- a/netease_api/module/user_level.js +++ /dev/null @@ -1,11 +0,0 @@ -// 类别热门电台 - -module.exports = (query, request) => { - const data = {}; - return request('POST', `https://music.163.com/weapi/user/level`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/user_playlist.js b/netease_api/module/user_playlist.js deleted file mode 100644 index cdef629..0000000 --- a/netease_api/module/user_playlist.js +++ /dev/null @@ -1,16 +0,0 @@ -// 用户歌单 - -module.exports = (query, request) => { - const data = { - uid: query.uid, - limit: query.limit || 30, - offset: query.offset || 0, - includeVideo: true, - }; - return request('POST', `https://music.163.com/api/user/playlist`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/user_record.js b/netease_api/module/user_record.js deleted file mode 100644 index a882701..0000000 --- a/netease_api/module/user_record.js +++ /dev/null @@ -1,14 +0,0 @@ -// 听歌排行 - -module.exports = (query, request) => { - const data = { - uid: query.uid, - type: query.type || 0, // 1: 最近一周, 0: 所有时间 - }; - return request('POST', `https://music.163.com/weapi/v1/play/record`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/user_replacephone.js b/netease_api/module/user_replacephone.js deleted file mode 100644 index ee8d459..0000000 --- a/netease_api/module/user_replacephone.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = (query, request) => { - const data = { - phone: query.phone, - captcha: query.captcha, - oldcaptcha: query.oldcaptcha, - countrycode: query.countrycode || '86', - }; - return request( - 'POST', - `https://music.163.com/api/user/replaceCellphone`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/user_subcount.js b/netease_api/module/user_subcount.js deleted file mode 100644 index 414ce01..0000000 --- a/netease_api/module/user_subcount.js +++ /dev/null @@ -1,15 +0,0 @@ -// 收藏计数 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/subcount`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/user_update.js b/netease_api/module/user_update.js deleted file mode 100644 index d84281c..0000000 --- a/netease_api/module/user_update.js +++ /dev/null @@ -1,24 +0,0 @@ -// 编辑用户信息 - -module.exports = (query, request) => { - const data = { - avatarImgId: '0', - birthday: query.birthday, - city: query.city, - gender: query.gender, - nickname: query.nickname, - province: query.province, - signature: query.signature, - }; - return request( - 'POST', - `https://music.163.com/weapi/user/profile/update`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/video_category_list.js b/netease_api/module/video_category_list.js deleted file mode 100644 index 40305fb..0000000 --- a/netease_api/module/video_category_list.js +++ /dev/null @@ -1,20 +0,0 @@ -// 视频分类列表 - -module.exports = (query, request) => { - const data = { - offset: query.offset || 0, - total: 'true', - limit: query.limit || 99, - }; - return request( - 'POST', - `https://music.163.com/api/cloudvideo/category/list`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/video_detail.js b/netease_api/module/video_detail.js deleted file mode 100644 index f668743..0000000 --- a/netease_api/module/video_detail.js +++ /dev/null @@ -1,18 +0,0 @@ -// 视频详情 - -module.exports = (query, request) => { - const data = { - id: query.id, - }; - return request( - 'POST', - `https://music.163.com/weapi/cloudvideo/v1/video/detail`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/video_detail_info.js b/netease_api/module/video_detail_info.js deleted file mode 100644 index c8ebd4b..0000000 --- a/netease_api/module/video_detail_info.js +++ /dev/null @@ -1,19 +0,0 @@ -// 视频点赞转发评论数数据 - -module.exports = (query, request) => { - const data = { - threadid: `R_VI_62_${query.vid}`, - composeliked: true, - }; - return request( - 'POST', - `https://music.163.com/api/comment/commentthread/info`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/video_group.js b/netease_api/module/video_group.js deleted file mode 100644 index 77ae3f6..0000000 --- a/netease_api/module/video_group.js +++ /dev/null @@ -1,21 +0,0 @@ -// 视频标签/分类下的视频 - -module.exports = (query, request) => { - const data = { - groupId: query.id, - offset: query.offset || 0, - need_preview_url: 'true', - total: true, - }; - return request( - 'POST', - `https://music.163.com/api/videotimeline/videogroup/otherclient/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/video_group_list.js b/netease_api/module/video_group_list.js deleted file mode 100644 index babe3ab..0000000 --- a/netease_api/module/video_group_list.js +++ /dev/null @@ -1,16 +0,0 @@ -// 视频标签列表 - -module.exports = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/cloudvideo/group/list`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/video_sub.js b/netease_api/module/video_sub.js deleted file mode 100644 index 1e46591..0000000 --- a/netease_api/module/video_sub.js +++ /dev/null @@ -1,19 +0,0 @@ -// 收藏与取消收藏视频 - -module.exports = (query, request) => { - query.t = query.t == 1 ? 'sub' : 'unsub'; - const data = { - id: query.id, - }; - return request( - 'POST', - `https://music.163.com/weapi/cloudvideo/video/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/video_timeline_all.js b/netease_api/module/video_timeline_all.js deleted file mode 100644 index 9c107a6..0000000 --- a/netease_api/module/video_timeline_all.js +++ /dev/null @@ -1,22 +0,0 @@ -// 全部视频列表 - -module.exports = (query, request) => { - const data = { - groupId: 0, - offset: query.offset || 0, - need_preview_url: 'true', - total: true, - }; - // /api/videotimeline/otherclient/get - return request( - 'POST', - `https://music.163.com/api/videotimeline/otherclient/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/video_timeline_recommend.js b/netease_api/module/video_timeline_recommend.js deleted file mode 100644 index a249089..0000000 --- a/netease_api/module/video_timeline_recommend.js +++ /dev/null @@ -1,17 +0,0 @@ -// 推荐视频 - -module.exports = (query, request) => { - const data = { - offset: query.offset || 0, - filterLives: '[]', - withProgramInfo: 'true', - needUrl: '1', - resolution: '480', - }; - return request('POST', `https://music.163.com/api/videotimeline/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/video_url.js b/netease_api/module/video_url.js deleted file mode 100644 index 8d2673c..0000000 --- a/netease_api/module/video_url.js +++ /dev/null @@ -1,19 +0,0 @@ -// 视频链接 - -module.exports = (query, request) => { - const data = { - ids: '["' + query.id + '"]', - resolution: query.res || 1080, - }; - return request( - 'POST', - `https://music.163.com/weapi/cloudvideo/playurl`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/weblog.js b/netease_api/module/weblog.js deleted file mode 100644 index 2b8d0be..0000000 --- a/netease_api/module/weblog.js +++ /dev/null @@ -1,15 +0,0 @@ -// 操作记录 - -module.exports = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/feedback/weblog`, - query.data || {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/yunbei.js b/netease_api/module/yunbei.js deleted file mode 100644 index 367fe3e..0000000 --- a/netease_api/module/yunbei.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = (query, request) => { - const data = {}; - // /api/point/today/get - return request('POST', `https://music.163.com/api/point/signed/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/yunbei_expense.js b/netease_api/module/yunbei_expense.js deleted file mode 100644 index 29ab8d0..0000000 --- a/netease_api/module/yunbei_expense.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = (query, request) => { - const data = { - limit: query.limit || 10, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/store/api/point/expense`, - data, - { - crypto: 'api', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/yunbei_info.js b/netease_api/module/yunbei_info.js deleted file mode 100644 index 7aa122a..0000000 --- a/netease_api/module/yunbei_info.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = (query, request) => { - const data = {}; - return request('POST', `https://music.163.com/api/v1/user/info`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/yunbei_receipt.js b/netease_api/module/yunbei_receipt.js deleted file mode 100644 index 7b662ce..0000000 --- a/netease_api/module/yunbei_receipt.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = (query, request) => { - const data = { - limit: query.limit || 10, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/store/api/point/receipt`, - data, - { - crypto: 'api', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/yunbei_sign.js b/netease_api/module/yunbei_sign.js deleted file mode 100644 index 0f1c913..0000000 --- a/netease_api/module/yunbei_sign.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = (query, request) => { - const data = { - type: '0', - }; - return request('POST', `https://music.163.com/api/point/dailyTask`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/module/yunbei_task_finish.js b/netease_api/module/yunbei_task_finish.js deleted file mode 100644 index 258c495..0000000 --- a/netease_api/module/yunbei_task_finish.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = (query, request) => { - const data = { - userTaskId: query.userTaskId, - depositCode: query.depositCode || '0', - }; - return request( - 'POST', - `https://music.163.com/api/usertool/task/point/receive`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/yunbei_tasks.js b/netease_api/module/yunbei_tasks.js deleted file mode 100644 index 7515e00..0000000 --- a/netease_api/module/yunbei_tasks.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/usertool/task/list/all`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/yunbei_tasks_todo.js b/netease_api/module/yunbei_tasks_todo.js deleted file mode 100644 index 924dced..0000000 --- a/netease_api/module/yunbei_tasks_todo.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/usertool/task/todo/query`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); -}; diff --git a/netease_api/module/yunbei_today.js b/netease_api/module/yunbei_today.js deleted file mode 100644 index 4f707f8..0000000 --- a/netease_api/module/yunbei_today.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = (query, request) => { - const data = {}; - return request('POST', `https://music.163.com/api/point/today/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); -}; diff --git a/netease_api/package-lock.json b/netease_api/package-lock.json deleted file mode 100644 index de5e769..0000000 --- a/netease_api/package-lock.json +++ /dev/null @@ -1,4096 +0,0 @@ -{ - "name": "NeteaseCloudMusicApi", - "version": "3.45.2", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.10.4.tgz?cache=0&sync_timestamp=1593522948158&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.10.4.tgz", - "integrity": "sha1-Fo2ho26Q2miujUnA8bSMfGJJITo=", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.10.4.tgz?cache=0&sync_timestamp=1593521083613&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-validator-identifier%2Fdownload%2F%40babel%2Fhelper-validator-identifier-7.10.4.tgz", - "integrity": "sha1-p4x6clHgH2FlEtMbEK3PUq2l4NI=", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.10.4.tgz?cache=0&sync_timestamp=1593521095576&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhighlight%2Fdownload%2F%40babel%2Fhighlight-7.10.4.tgz", - "integrity": "sha1-fRvf1ldTU4+r5sOFls23bZrGAUM=", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1591687076871&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@eslint/eslintrc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.0.tgz", - "integrity": "sha512-+cIGPCBdLCzqxdtwppswP+zTsH9BOIGzAeKfBIbtb4gW/giMlfMwP0HUSFfhzh20f9u8uZ8hOp62+4GPquTbwQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npm.taobao.org/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.3.tgz", - "integrity": "sha1-Olgr21OATGum0UZXnEblITDPSjs=", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-2.0.3.tgz", - "integrity": "sha1-NNxfTKu8cg9OYPdadH5+zWwXW9M=", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npm.taobao.org/@nodelib/fs.walk/download/@nodelib/fs.walk-1.2.4.tgz", - "integrity": "sha1-ARuSAqcKY2bkNspcBlhEUoqwSXY=", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@tootallnate/once/download/@tootallnate/once-1.1.2.tgz", - "integrity": "sha1-zLkURTYBeaBOf+av94wA/8Hur4I=" - }, - "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npm.taobao.org/@types/json-schema/download/@types/json-schema-7.0.6.tgz?cache=0&sync_timestamp=1598910403749&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.6.tgz", - "integrity": "sha1-9MfsQ+gbMZqYFRFQMXCfJph4kfA=", - "dev": true - }, - "@types/node": { - "version": "14.11.10", - "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-14.11.10.tgz", - "integrity": "sha1-jBAquhO/UlPzUUav+/iyYnUGm+8=", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/@types/parse-json/download/@types/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1596839394119&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fparse-json%2Fdownload%2F%40types%2Fparse-json-4.0.0.tgz", - "integrity": "sha1-L4u0QUNNFjs1+4/9zNcTiSf/uMA=", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.4.1", - "resolved": "https://registry.npm.taobao.org/@typescript-eslint/eslint-plugin/download/@typescript-eslint/eslint-plugin-4.4.1.tgz?cache=0&sync_timestamp=1603565073344&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40typescript-eslint%2Feslint-plugin%2Fdownload%2F%40typescript-eslint%2Feslint-plugin-4.4.1.tgz", - "integrity": "sha1-uKzqA3O9KjiKxH30RlLwC/izaPU=", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.4.1", - "@typescript-eslint/scope-manager": "4.4.1", - "debug": "^4.1.1", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", - "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - } - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.4.1", - "resolved": "https://registry.npm.taobao.org/@typescript-eslint/experimental-utils/download/@typescript-eslint/experimental-utils-4.4.1.tgz?cache=0&sync_timestamp=1603563239927&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40typescript-eslint%2Fexperimental-utils%2Fdownload%2F%40typescript-eslint%2Fexperimental-utils-4.4.1.tgz", - "integrity": "sha1-QGE7l1f6AXDePgBDJU27B3yvrAw=", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.4.1", - "@typescript-eslint/types": "4.4.1", - "@typescript-eslint/typescript-estree": "4.4.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "4.4.1", - "resolved": "https://registry.npm.taobao.org/@typescript-eslint/parser/download/@typescript-eslint/parser-4.4.1.tgz?cache=0&sync_timestamp=1603563241160&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40typescript-eslint%2Fparser%2Fdownload%2F%40typescript-eslint%2Fparser-4.4.1.tgz", - "integrity": "sha1-Jf3pwIBhHzA/LzPO2xRdLFmRW4A=", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.4.1", - "@typescript-eslint/types": "4.4.1", - "@typescript-eslint/typescript-estree": "4.4.1", - "debug": "^4.1.1" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", - "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - } - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.4.1", - "resolved": "https://registry.npm.taobao.org/@typescript-eslint/scope-manager/download/@typescript-eslint/scope-manager-4.4.1.tgz", - "integrity": "sha1-0ZRH5g2yzpxCWJjWL6A7LM6Oo/k=", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.4.1", - "@typescript-eslint/visitor-keys": "4.4.1" - } - }, - "@typescript-eslint/types": { - "version": "4.4.1", - "resolved": "https://registry.npm.taobao.org/@typescript-eslint/types/download/@typescript-eslint/types-4.4.1.tgz", - "integrity": "sha1-xQezXPUjvHugCq5fde6bgQzau8E=", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.4.1", - "resolved": "https://registry.npm.taobao.org/@typescript-eslint/typescript-estree/download/@typescript-eslint/typescript-estree-4.4.1.tgz?cache=0&sync_timestamp=1603563238913&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40typescript-eslint%2Ftypescript-estree%2Fdownload%2F%40typescript-eslint%2Ftypescript-estree-4.4.1.tgz", - "integrity": "sha1-WY9t5IgQbCWH1HyiRixg9uJ5fLg=", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.4.1", - "@typescript-eslint/visitor-keys": "4.4.1", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", - "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.4.1", - "resolved": "https://registry.npm.taobao.org/@typescript-eslint/visitor-keys/download/@typescript-eslint/visitor-keys-4.4.1.tgz", - "integrity": "sha1-F2ncep4tfSz9Mxi3ftgkkYeu1cM=", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.4.1", - "eslint-visitor-keys": "^2.0.0" - } - }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@ungap/promise-all-settled/download/@ungap/promise-all-settled-1.1.2.tgz", - "integrity": "sha1-qlgEJxHW4ydd033Fl+XTHowpCkQ=", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz", - "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-es7-plugin": { - "version": "1.1.7", - "resolved": "https://registry.npm.taobao.org/acorn-es7-plugin/download/acorn-es7-plugin-1.1.7.tgz", - "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s=", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npm.taobao.org/agent-base/download/agent-base-6.0.2.tgz?cache=0&sync_timestamp=1603480100923&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fagent-base%2Fdownload%2Fagent-base-6.0.2.tgz", - "integrity": "sha1-Sf/1hXfP7j83F2/qtMIuAPhtf3c=", - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", - "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" - } - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/aggregate-error/download/aggregate-error-3.1.0.tgz?cache=0&sync_timestamp=1598049717562&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faggregate-error%2Fdownload%2Faggregate-error-3.1.0.tgz", - "integrity": "sha1-kmcP9Q9TWb23o+DUDQ7DDFc3aHo=", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1603561547443&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", - "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-4.1.1.tgz", - "integrity": "sha1-y7muJWv3UK8eqzRPIpqif+lLo0g=", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-4.3.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-escapes%2Fdownload%2Fansi-escapes-4.3.1.tgz", - "integrity": "sha1-pcR8xDGB8fOP/XB2g3cA05VSKmE=", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.11.0.tgz?cache=0&sync_timestamp=1602623859603&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype-fest%2Fdownload%2Ftype-fest-0.11.0.tgz", - "integrity": "sha1-l6vwhyMQ/tiKXEZrJWgVdhReM/E=", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz", - "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz?cache=0&sync_timestamp=1601839122515&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz", - "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz?cache=0&sync_timestamp=1598649734444&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fargparse%2Fdownload%2Fargparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/array-filter/download/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "dev": true - }, - "array-find": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/array-find/download/array-find-1.0.0.tgz", - "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz?cache=0&sync_timestamp=1574313384951&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farray-flatten%2Fdownload%2Farray-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/array-union/download/array-union-2.1.0.tgz", - "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=", - "dev": true - }, - "ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npm.taobao.org/ast-types/download/ast-types-0.13.4.tgz?cache=0&sync_timestamp=1599935985242&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fast-types%2Fdownload%2Fast-types-0.13.4.tgz", - "integrity": "sha1-7g13s0MmOWXsw/ti2hbnIisrZ4I=", - "requires": { - "tslib": "^2.0.1" - } - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/astral-regex/download/astral-regex-1.0.0.tgz", - "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=", - "dev": true - }, - "axios": { - "version": "0.20.0", - "resolved": "https://registry.npm.taobao.org/axios/download/axios-0.20.0.tgz", - "integrity": "sha1-BXujDwSIRpSZOozQf6OUz/EcUL0=", - "requires": { - "follow-redirects": "^1.10.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.1.0.tgz", - "integrity": "sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz", - "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz?cache=0&sync_timestamp=1601898189928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrace-expansion%2Fdownload%2Fbrace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", - "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/browser-stdout/download/browser-stdout-1.3.1.tgz", - "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", - "dev": true - }, - "busboy": { - "version": "0.3.1", - "resolved": "https://registry.npm.taobao.org/busboy/download/busboy-0.3.1.tgz", - "integrity": "sha1-FwiZJ0xb84quJ9XGK3EmjNWF/Rs=", - "requires": { - "dicer": "0.3.0" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz", - "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=" - }, - "call-matcher": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/call-matcher/download/call-matcher-1.1.0.tgz", - "integrity": "sha1-I7LBvHqDlMi+KGCdd929V4ZoBDI=", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "deep-equal": "^1.0.0", - "espurify": "^1.6.0", - "estraverse": "^4.0.0" - } - }, - "call-signature": { - "version": "0.0.2", - "resolved": "https://registry.npm.taobao.org/call-signature/download/call-signature-0.0.2.tgz", - "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-3.1.0.tgz", - "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz?cache=0&sync_timestamp=1602350083472&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz?cache=0&sync_timestamp=1591687076871&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-4.1.0.tgz", - "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839122515&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", - "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", - "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", - "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1598611709087&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", - "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.3.tgz?cache=0&sync_timestamp=1602585381749&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.3.tgz", - "integrity": "sha1-wd84IxRI5FykrFiObHlXO6alfVs=", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ci-info/download/ci-info-2.0.0.tgz", - "integrity": "sha1-Z6npZL4xpR4V5QENWObxKDQAL0Y=", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/clean-stack/download/clean-stack-2.2.0.tgz?cache=0&sync_timestamp=1592035524745&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclean-stack%2Fdownload%2Fclean-stack-2.2.0.tgz", - "integrity": "sha1-7oRy27Ep5yezHooQpCfe6d/kAIs=", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-3.1.0.tgz", - "integrity": "sha1-JkMFp65JDR0Dvwybp8kl0XU68wc=", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/cli-truncate/download/cli-truncate-2.1.0.tgz", - "integrity": "sha1-w54ovwXtzeW+O5iZKiLe7Vork8c=", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839122515&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", - "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/astral-regex/download/astral-regex-2.0.0.tgz", - "integrity": "sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", - "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1603212180491&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz", - "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", - "dev": true - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-3.0.0.tgz", - "integrity": "sha1-Md3BCTCht+C2ewjJbC9Jt3p4l4c=", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz", - "integrity": "sha1-lSGCxGzHssMT0VluYjmSvRY7crU=", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz?cache=0&sync_timestamp=1602861367442&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-5.0.0.tgz", - "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz", - "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commander": { - "version": "6.2.0", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-6.2.0.tgz?cache=0&sync_timestamp=1603599636161&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-6.2.0.tgz", - "integrity": "sha1-uZC/uKwDCu3G0RvATRSI/+9W23U=", - "dev": true - }, - "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/compare-versions/download/compare-versions-3.6.0.tgz", - "integrity": "sha1-GlaJkTaF5ah2N7jT/8p1UU7EHWI=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz", - "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.7.0.tgz?cache=0&sync_timestamp=1573003637425&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconvert-source-map%2Fdownload%2Fconvert-source-map-1.7.0.tgz", - "integrity": "sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz?cache=0&sync_timestamp=1587525865178&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcookie%2Fdownload%2Fcookie-0.4.0.tgz", - "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-2.6.11.tgz?cache=0&sync_timestamp=1586450269267&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-2.6.11.tgz", - "integrity": "sha1-OIMUafmSK97Y7iHJ3EaYXgOZMIw=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-6.0.0.tgz?cache=0&sync_timestamp=1596310819353&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-6.0.0.tgz", - "integrity": "sha1-2k/uhTxS9rHmk19BwaL8UL1KmYI=", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz", - "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/d/download/d-1.0.1.tgz", - "integrity": "sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o=", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/data-uri-to-buffer/download/data-uri-to-buffer-3.0.1.tgz?cache=0&sync_timestamp=1590800007667&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdata-uri-to-buffer%2Fdownload%2Fdata-uri-to-buffer-3.0.1.tgz", - "integrity": "sha1-WUuJc5OMW8LDMEZTV4U0GrxPNjY=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npm.taobao.org/dedent/download/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.1.1.tgz", - "integrity": "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz", - "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "degenerator": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/degenerator/download/degenerator-2.2.0.tgz", - "integrity": "sha1-SemMEfoCk8Wybt+7UvFXKa/NslQ=", - "requires": { - "ast-types": "^0.13.2", - "escodegen": "^1.8.1", - "esprima": "^4.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "dicer": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/dicer/download/dicer-0.3.0.tgz", - "integrity": "sha1-6s2Ys7+/kuirXC/bcaqsRLsGuHI=", - "requires": { - "streamsearch": "0.1.2" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/diff/download/diff-4.0.2.tgz?cache=0&sync_timestamp=1578890967183&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdiff%2Fdownload%2Fdiff-4.0.2.tgz", - "integrity": "sha1-YPOuy4nV+uUgwRqhnvwruYKq3n0=", - "dev": true - }, - "diff-match-patch": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/diff-match-patch/download/diff-match-patch-1.0.5.tgz", - "integrity": "sha1-q7WE1fEM0Rlt/FWqA3AVkq4/ezc=", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-3.0.1.tgz", - "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz", - "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-1.1.0.tgz", - "integrity": "sha1-X3yCjxv8RIh9wqMVq1xFaR1US1g=", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^3.0.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.0.2.tgz?cache=0&sync_timestamp=1600028495728&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.0.2.tgz", - "integrity": "sha1-87blSSAeRvWItZRj3XcYcTH+aXE=", - "dev": true - }, - "domhandler": { - "version": "3.3.0", - "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-3.3.0.tgz", - "integrity": "sha1-bbfqRuRhfrFc+HXfaLK4UkzgA3o=", - "dev": true, - "requires": { - "domelementtype": "^2.0.1" - } - }, - "domutils": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-2.4.2.tgz", - "integrity": "sha1-fuW+JhlE4a1IfZqgYWcgAQEjkis=", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.0.1", - "domhandler": "^3.3.0" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/eastasianwidth/download/eastasianwidth-0.2.0.tgz", - "integrity": "sha1-aWzi7Aqg5uqTo5f/zySqeEDIJ8s=", - "dev": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz?cache=0&sync_timestamp=1603212180491&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Femoji-regex%2Fdownload%2Femoji-regex-7.0.3.tgz", - "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", - "dev": true - }, - "empower": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/empower/download/empower-1.3.1.tgz", - "integrity": "sha1-dol5y7s21x2PXtqrZj3qy52rkWw=", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "empower-core": "^1.2.0" - } - }, - "empower-assert": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/empower-assert/download/empower-assert-1.1.0.tgz", - "integrity": "sha1-jTJ/vmmoivkN2pjRv8mCnSok/WI=", - "dev": true, - "requires": { - "estraverse": "^4.2.0" - } - }, - "empower-core": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/empower-core/download/empower-core-1.2.0.tgz", - "integrity": "sha1-zj+ySE1Rh/opwj+6g0Swsv31YBw=", - "dev": true, - "requires": { - "call-signature": "0.0.2", - "core-js": "^2.0.0" - } - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz", - "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npm.taobao.org/enquirer/download/enquirer-2.3.6.tgz?cache=0&sync_timestamp=1593693291943&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fenquirer%2Fdownload%2Fenquirer-2.3.6.tgz", - "integrity": "sha1-Kn/l3WNKHkElqXXsmU/1RW3Dc00=", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "entities": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/entities/download/entities-2.1.0.tgz?cache=0&sync_timestamp=1602897029273&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-2.1.0.tgz", - "integrity": "sha1-mS0xKc999ocLlsV4WMJJoSD4uLU=", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", - "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npm.taobao.org/es-abstract/download/es-abstract-1.18.0-next.1.tgz?cache=0&sync_timestamp=1601502719982&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fes-abstract%2Fdownload%2Fes-abstract-1.18.0-next.1.tgz", - "integrity": "sha1-bjoKS9pxflAjqzuOkL7DYQjSLGg=", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.1.tgz", - "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.53.tgz", - "integrity": "sha1-k8WjrP2+8nUiCtcmRK0C7hg2jeE=", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npm.taobao.org/es6-map/download/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npm.taobao.org/es6-set/download/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - }, - "dependencies": { - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - } - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.3.tgz", - "integrity": "sha1-utXTwbzawoJp9MszHkMceKxwXRg=", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/es6-weak-map/download/es6-weak-map-2.0.3.tgz", - "integrity": "sha1-ttofFswswNm+Q+a9v8Xn383zHVM=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escallmatch": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/escallmatch/download/escallmatch-1.5.0.tgz", - "integrity": "sha1-UAmdhugJGwkt+N37w/mm+wWgJNA=", - "dev": true, - "requires": { - "call-matcher": "^1.0.0", - "esprima": "^2.0.0" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - } - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npm.taobao.org/escodegen/download/escodegen-1.14.3.tgz?cache=0&sync_timestamp=1596669832613&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescodegen%2Fdownload%2Fescodegen-1.14.3.tgz", - "integrity": "sha1-TnuB+6YVgdyXWC7XjKt/Do1j9QM=", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/escope/download/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.0.tgz", - "integrity": "sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.2.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.0", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", - "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz?cache=0&sync_timestamp=1590809289115&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-4.0.6.tgz", - "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.4.1.tgz", - "integrity": "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.9.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Foptionator%2Fdownload%2Foptionator-0.9.1.tgz", - "integrity": "sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk=", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.2.1.tgz", - "integrity": "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.4.0.tgz", - "integrity": "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - } - } - }, - "eslint-config-prettier": { - "version": "6.13.0", - "resolved": "https://registry.npm.taobao.org/eslint-config-prettier/download/eslint-config-prettier-6.13.0.tgz?cache=0&sync_timestamp=1603294035236&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-config-prettier%2Fdownload%2Feslint-config-prettier-6.13.0.tgz", - "integrity": "sha1-IH2IeWtWJOW7gVu738WJHOuev/o=", - "dev": true, - "requires": { - "get-stdin": "^6.0.0" - } - }, - "eslint-plugin-html": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/eslint-plugin-html/download/eslint-plugin-html-6.0.3.tgz?cache=0&sync_timestamp=1599391535931&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-html%2Fdownload%2Feslint-plugin-html-6.0.3.tgz", - "integrity": "sha1-jZ0sGH0aSO142E9F4pgg8QJCXlE=", - "dev": true, - "requires": { - "htmlparser2": "^4.1.0" - } - }, - "eslint-plugin-prettier": { - "version": "3.1.4", - "resolved": "https://registry.npm.taobao.org/eslint-plugin-prettier/download/eslint-plugin-prettier-3.1.4.tgz", - "integrity": "sha1-Foq0MVTi6lfbmSos0JfIKBcfdcI=", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-5.1.1.tgz?cache=0&sync_timestamp=1599933651660&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-5.1.1.tgz", - "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/eslint-utils/download/eslint-utils-2.1.0.tgz?cache=0&sync_timestamp=1592222145079&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-utils%2Fdownload%2Feslint-utils-2.1.0.tgz", - "integrity": "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc=", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz?cache=0&sync_timestamp=1597435068105&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.3.0.tgz", - "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-2.0.0.tgz?cache=0&sync_timestamp=1597435068105&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-2.0.0.tgz", - "integrity": "sha1-If3I+82ceVzAMh8FY3AglXUVEag=", - "dev": true - }, - "espower": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/espower/download/espower-2.1.2.tgz", - "integrity": "sha1-gk+IeI+f7fTPD5KPXhG7kHzpuRg=", - "dev": true, - "requires": { - "array-find": "^1.0.0", - "escallmatch": "^1.5.0", - "escodegen": "^1.7.0", - "escope": "^3.3.0", - "espower-location-detector": "^1.0.0", - "espurify": "^1.3.0", - "estraverse": "^4.1.0", - "source-map": "^0.5.0", - "type-name": "^2.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz?cache=0&sync_timestamp=1571657176668&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "espower-loader": { - "version": "1.2.2", - "resolved": "https://registry.npm.taobao.org/espower-loader/download/espower-loader-1.2.2.tgz", - "integrity": "sha1-7bRsPFmga6yOpzppXIblxaC8gto=", - "dev": true, - "requires": { - "convert-source-map": "^1.1.0", - "espower-source": "^2.0.0", - "minimatch": "^3.0.0", - "source-map-support": "^0.4.0", - "xtend": "^4.0.0" - } - }, - "espower-location-detector": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/espower-location-detector/download/espower-location-detector-1.0.0.tgz", - "integrity": "sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU=", - "dev": true, - "requires": { - "is-url": "^1.2.1", - "path-is-absolute": "^1.0.0", - "source-map": "^0.5.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz?cache=0&sync_timestamp=1571657176668&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "espower-source": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/espower-source/download/espower-source-2.3.0.tgz", - "integrity": "sha1-Q+k7LBivUAGL2xvqehJx9KHBJfQ=", - "dev": true, - "requires": { - "acorn": "^5.0.0", - "acorn-es7-plugin": "^1.0.10", - "convert-source-map": "^1.1.1", - "empower-assert": "^1.0.0", - "escodegen": "^1.10.0", - "espower": "^2.1.1", - "estraverse": "^4.0.0", - "merge-estraverse-visitors": "^1.0.0", - "multi-stage-sourcemap": "^0.2.1", - "path-is-absolute": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-5.7.4.tgz", - "integrity": "sha1-Po2KmUfQWZoXltECJddDL0pKz14=", - "dev": true - } - } - }, - "espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=" - }, - "espurify": { - "version": "1.8.1", - "resolved": "https://registry.npm.taobao.org/espurify/download/espurify-1.8.1.tgz", - "integrity": "sha1-V0bGwatC0wLeEL0dW/fw6MBRUFY=", - "dev": true, - "requires": { - "core-js": "^2.0.0" - } - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/esquery/download/esquery-1.3.1.tgz?cache=0&sync_timestamp=1587061286348&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesquery%2Fdownload%2Fesquery-1.3.1.tgz", - "integrity": "sha1-t4tYKKqOIU4p+3TE1bdS4cAz2lc=", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz?cache=0&sync_timestamp=1596642998635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-5.2.0.tgz", - "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.3.0.tgz?cache=0&sync_timestamp=1598898255610&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesrecurse%2Fdownload%2Fesrecurse-4.3.0.tgz", - "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz?cache=0&sync_timestamp=1596642998635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-5.2.0.tgz", - "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1596642998635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz", - "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz", - "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npm.taobao.org/event-emitter/download/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "execa": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/execa/download/execa-4.0.3.tgz?cache=0&sync_timestamp=1594145085955&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-4.0.3.tgz", - "integrity": "sha1-CjTau61tZhAL1vLFdshmlAPzF/I=", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexpress%2Fdownload%2Fexpress-4.17.1.tgz", - "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "express-fileupload": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/express-fileupload/download/express-fileupload-1.2.0.tgz", - "integrity": "sha1-NWxN/WRb5xq5+y9ObYTusA0keXk=", - "requires": { - "busboy": "^0.3.1" - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/ext/download/ext-1.4.0.tgz", - "integrity": "sha1-ia56BxWPedNVF4gpBDJAd+Q3kkQ=", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/type/download/type-2.1.0.tgz?cache=0&sync_timestamp=1598016585110&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype%2Fdownload%2Ftype-2.1.0.tgz", - "integrity": "sha1-m9wixkjPjPht0j0yM2pBz7ZHXj8=", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz?cache=0&sync_timestamp=1591599697571&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-3.1.3.tgz", - "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/fast-diff/download/fast-diff-1.2.0.tgz", - "integrity": "sha1-c+4RmC2Gyq95WYKNUZz+kn+sXwM=", - "dev": true - }, - "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npm.taobao.org/fast-glob/download/fast-glob-3.2.4.tgz?cache=0&sync_timestamp=1592291968616&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-glob%2Fdownload%2Ffast-glob-3.2.4.tgz", - "integrity": "sha1-0grvv5lXk4Pn88xmUpFYybmFVNM=", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz?cache=0&sync_timestamp=1576340291001&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-json-stable-stringify%2Fdownload%2Ffast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npm.taobao.org/fastq/download/fastq-1.8.0.tgz?cache=0&sync_timestamp=1589280329638&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffastq%2Fdownload%2Ffastq-1.8.0.tgz", - "integrity": "sha1-VQ4fn1m7xl/hhctqm02VNXEH9IE=", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/figures/download/figures-3.2.0.tgz?cache=0&sync_timestamp=1581865349068&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffigures%2Fdownload%2Ffigures-3.2.0.tgz", - "integrity": "sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-5.0.1.tgz", - "integrity": "sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w=", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-uri-to-path": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-2.0.0.tgz", - "integrity": "sha1-e0Fa66In1XWFHgpbDGQNdlZAP7o=" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", - "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz", - "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz?cache=0&sync_timestamp=1597169842138&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-4.1.0.tgz", - "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "find-versions": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/find-versions/download/find-versions-3.2.0.tgz", - "integrity": "sha1-ECl/mAMKeGgpaBaQVF72We0dJU4=", - "dev": true, - "requires": { - "semver-regex": "^2.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npm.taobao.org/flat/download/flat-5.0.2.tgz?cache=0&sync_timestamp=1602723468701&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fflat%2Fdownload%2Fflat-5.0.2.tgz", - "integrity": "sha1-jKb+MyBp/6nTJMMnGYxZglnOskE=", - "dev": true - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/flat-cache/download/flat-cache-2.0.1.tgz", - "integrity": "sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA=", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/flatted/download/flatted-2.0.2.tgz", - "integrity": "sha1-RXWyHivO50NKqb5mL0t7X5wrUTg=", - "dev": true - }, - "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.13.0.tgz?cache=0&sync_timestamp=1597057976909&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.13.0.tgz", - "integrity": "sha1-tC6Nk6Kn7qXtiGM2dtZZe8jjhNs=" - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz", - "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz?cache=0&sync_timestamp=1588787369955&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.1.3.tgz", - "integrity": "sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=", - "dev": true, - "optional": true - }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.npm.taobao.org/ftp/download/ftp-0.3.10.tgz", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", - "requires": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz", - "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", - "dev": true - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/get-own-enumerable-property-symbols/download/get-own-enumerable-property-symbols-3.0.2.tgz?cache=0&sync_timestamp=1575993334275&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-own-enumerable-property-symbols%2Fdownload%2Fget-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha1-tf3nfyLL4185C04ImSLFC85u9mQ=", - "dev": true - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npm.taobao.org/get-stdin/download/get-stdin-6.0.0.tgz", - "integrity": "sha1-ngm/cSs2CrkiXoEgSPcf3pyJZXs=", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-5.2.0.tgz?cache=0&sync_timestamp=1597056502934&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-5.2.0.tgz", - "integrity": "sha1-SWaheV7lrOZecGxLe+txJX1uItM=", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-uri": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/get-uri/download/get-uri-3.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-uri%2Fdownload%2Fget-uri-3.0.2.tgz", - "integrity": "sha1-8O8TVvqrxw4flAT6O2ayupv8clw=", - "requires": { - "@tootallnate/once": "1", - "data-uri-to-buffer": "3", - "debug": "4", - "file-uri-to-path": "2", - "fs-extra": "^8.1.0", - "ftp": "^0.3.10" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", - "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" - } - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz?cache=0&sync_timestamp=1573078121947&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob%2Fdownload%2Fglob-7.1.6.tgz", - "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", - "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "globby": { - "version": "11.0.1", - "resolved": "https://registry.npm.taobao.org/globby/download/globby-11.0.1.tgz?cache=0&sync_timestamp=1591083783605&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobby%2Fdownload%2Fglobby-11.0.1.tgz", - "integrity": "sha1-mivxB6Bo8//qvEmtcCx57ejP01c=", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.4.tgz", - "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npm.taobao.org/growl/download/growl-1.10.5.tgz", - "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.1.tgz", - "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz", - "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", - "dev": true - }, - "htmlparser2": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-4.1.0.tgz?cache=0&sync_timestamp=1601761730691&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-4.1.0.tgz", - "integrity": "sha1-mk7xYfLkYl6/ffvmwKL1LRilnng=", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^3.0.0", - "domutils": "^2.0.0", - "entities": "^2.0.0" - } - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1593407858306&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz", - "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/http-proxy-agent/download/http-proxy-agent-4.0.1.tgz", - "integrity": "sha1-ioyO9/WTLM+VPClsqCkblap0qjo=", - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", - "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" - } - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/https-proxy-agent/download/https-proxy-agent-5.0.0.tgz?cache=0&sync_timestamp=1581106803611&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttps-proxy-agent%2Fdownload%2Fhttps-proxy-agent-5.0.0.tgz", - "integrity": "sha1-4qkFQqu2inYuCghQ9sntrf2FBrI=", - "requires": { - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", - "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" - } - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/human-signals/download/human-signals-1.1.1.tgz?cache=0&sync_timestamp=1584198662293&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhuman-signals%2Fdownload%2Fhuman-signals-1.1.1.tgz", - "integrity": "sha1-xbHNFPUK6uCatsWf5jujOV/k36M=", - "dev": true - }, - "husky": { - "version": "4.2.5", - "resolved": "https://registry.npm.taobao.org/husky/download/husky-4.2.5.tgz?cache=0&sync_timestamp=1602813564105&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhusky%2Fdownload%2Fhusky-4.2.5.tgz", - "integrity": "sha1-K092Imc6cVefkB2Yhe1Eg5S1+jY=", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.6.0", - "cosmiconfig": "^6.0.0", - "find-versions": "^3.2.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1594184264130&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-5.1.8.tgz?cache=0&sync_timestamp=1590809289115&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-5.1.8.tgz", - "integrity": "sha1-8VCotQo0KJsz4i9YiavU2AFvDlc=", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.2.1.tgz", - "integrity": "sha1-Yz/2GFBueTr1rJG/SLcmd+FcvmY=", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-4.0.0.tgz", - "integrity": "sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npm.taobao.org/indexof/download/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "intelli-espower-loader": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/intelli-espower-loader/download/intelli-espower-loader-1.0.1.tgz", - "integrity": "sha1-LHsDFGvB1GvyENCgOXxckatMorA=", - "dev": true, - "requires": { - "espower-loader": "^1.0.0" - } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npm.taobao.org/ip/download/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.9.1.tgz", - "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=" - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/is-arguments/download/is-arguments-1.0.4.tgz", - "integrity": "sha1-P6+WbHy6D/Q3+zH2JQCC/PBEjPM=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", - "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npm.taobao.org/is-callable/download/is-callable-1.2.2.tgz?cache=0&sync_timestamp=1600719276620&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-callable%2Fdownload%2Fis-callable-1.2.2.tgz", - "integrity": "sha1-x8ZxXNItTdtI0+GZcCI6zquwgNk=", - "dev": true - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.2.tgz?cache=0&sync_timestamp=1576729165697&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-date-object%2Fdownload%2Fis-date-object-1.0.2.tgz", - "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz", - "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-negative-zero/download/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", - "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-2.1.0.tgz?cache=0&sync_timestamp=1602541451286&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-2.1.0.tgz", - "integrity": "sha1-ReQuN/zPH0Dajl927iFRWEDAkoc=", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/is-regex/download/is-regex-1.1.1.tgz?cache=0&sync_timestamp=1596555762356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-regex%2Fdownload%2Fis-regex-1.1.1.tgz", - "integrity": "sha1-xvmKrMVG9s7FRooHt7FTq1ZKV7k=", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-regexp/download/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-2.0.0.tgz", - "integrity": "sha1-venDJoDW+uBBKdasnZIc54FfeOM=", - "dev": true - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.3.tgz", - "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npm.taobao.org/is-url/download/is-url-1.2.4.tgz", - "integrity": "sha1-BKTfRtKMTP89c9Af8Gq+sxihqlI=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz?cache=0&sync_timestamp=1586796260005&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-tokens%2Fdownload%2Fjs-tokens-4.0.0.tgz", - "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-yaml%2Fdownload%2Fjs-yaml-3.14.0.tgz", - "integrity": "sha1-p6NBcPJqIbsWJCTYray0ETpp5II=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npm.taobao.org/json-parse-even-better-errors/download/json-parse-even-better-errors-2.3.1.tgz?cache=0&sync_timestamp=1599064788298&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-parse-even-better-errors%2Fdownload%2Fjson-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz?cache=0&sync_timestamp=1599333856086&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-0.4.1.tgz", - "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "lint-staged": { - "version": "10.4.0", - "resolved": "https://registry.npm.taobao.org/lint-staged/download/lint-staged-10.4.0.tgz?cache=0&sync_timestamp=1602914408937&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flint-staged%2Fdownload%2Flint-staged-10.4.0.tgz", - "integrity": "sha1-0YYo9zcyjgu7+H0YP0Agkw6amE4=", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "cli-truncate": "^2.1.0", - "commander": "^6.0.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.1.1", - "dedent": "^0.7.0", - "enquirer": "^2.3.6", - "execa": "^4.0.3", - "listr2": "^2.6.0", - "log-symbols": "^4.0.0", - "micromatch": "^4.0.2", - "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "string-argv": "0.3.1", - "stringify-object": "^3.3.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-7.0.0.tgz?cache=0&sync_timestamp=1596310819353&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-7.0.0.tgz", - "integrity": "sha1-75tE13OVnK5j3ezRIt4jhTtg+NM=", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", - "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - } - } - }, - "listr2": { - "version": "2.6.2", - "resolved": "https://registry.npm.taobao.org/listr2/download/listr2-2.6.2.tgz", - "integrity": "sha1-SRLrAeHi3XLsN/OJWla/JiLW82o=", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "cli-truncate": "^2.1.0", - "figures": "^3.2.0", - "indent-string": "^4.0.0", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rxjs": "^6.6.2", - "through": "^2.3.8" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", - "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597335994883&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz", - "integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=", - "dev": true - }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/log-symbols/download/log-symbols-4.0.0.tgz?cache=0&sync_timestamp=1587898912367&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flog-symbols%2Fdownload%2Flog-symbols-4.0.0.tgz", - "integrity": "sha1-abPMRtIPRI7M23XqH6cz2eghySA=", - "dev": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/log-update/download/log-update-4.0.0.tgz?cache=0&sync_timestamp=1582186170811&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flog-update%2Fdownload%2Flog-update-4.0.0.tgz", - "integrity": "sha1-WJ7NNSRx8qHAxXAodUOmTf0g4KE=", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839122515&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", - "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/astral-regex/download/astral-regex-2.0.0.tgz", - "integrity": "sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", - "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-4.0.0.tgz", - "integrity": "sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms=", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - } - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-estraverse-visitors": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/merge-estraverse-visitors/download/merge-estraverse-visitors-1.0.0.tgz", - "integrity": "sha1-65aDOLXe1c7tgs7AMH3sui2OqZQ=", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/merge-stream/download/merge-stream-2.0.0.tgz", - "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz?cache=0&sync_timestamp=1591170027156&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmerge2%2Fdownload%2Fmerge2-1.4.1.tgz", - "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.2.tgz", - "integrity": "sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz?cache=0&sync_timestamp=1590596706367&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.44.0.tgz?cache=0&sync_timestamp=1600831210195&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.44.0.tgz", - "integrity": "sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I=" - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.27.tgz", - "integrity": "sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=", - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz?cache=0&sync_timestamp=1596095644798&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-fn%2Fdownload%2Fmimic-fn-2.1.0.tgz", - "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminimist%2Fdownload%2Fminimist-1.2.5.tgz", - "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz?cache=0&sync_timestamp=1587535418745&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.5.tgz", - "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mocha": { - "version": "8.2.0", - "resolved": "https://registry.npm.taobao.org/mocha/download/mocha-8.2.0.tgz?cache=0&sync_timestamp=1602881142408&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmocha%2Fdownload%2Fmocha-8.2.0.tgz", - "integrity": "sha1-+Kp5EQtLWmWAxl1N2Ag8QlKCYk4=", - "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.4.3", - "debug": "4.2.0", - "diff": "4.0.2", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.14.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", - "ms": "2.1.2", - "nanoid": "3.1.12", - "serialize-javascript": "5.0.1", - "strip-json-comments": "3.1.1", - "supports-color": "7.2.0", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.0.2", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", - "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-4.0.0.tgz", - "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-5.0.0.tgz?cache=0&sync_timestamp=1597169842138&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-5.0.0.tgz", - "integrity": "sha1-TJKBnstwg1YeT0okCoa+UZj1Nvw=", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", - "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-6.0.0.tgz", - "integrity": "sha1-VTIeswn+u8WcSAHZMackUqaB0oY=", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-3.0.2.tgz?cache=0&sync_timestamp=1594559734248&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-limit%2Fdownload%2Fp-limit-3.0.2.tgz", - "integrity": "sha1-FmTgEK88rcaBuq/T4qQ3vnsPtf4=", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-5.0.0.tgz", - "integrity": "sha1-g8gxXGeFAF470CGDlBHJ4RDm2DQ=", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1598611709087&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", - "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multi-stage-sourcemap": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/multi-stage-sourcemap/download/multi-stage-sourcemap-0.2.1.tgz", - "integrity": "sha1-sJ/IWG6qF/gdV1xK0C4Pej9rEQU=", - "dev": true, - "requires": { - "source-map": "^0.1.34" - }, - "dependencies": { - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.1.43.tgz?cache=0&sync_timestamp=1571657176668&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "nanoid": { - "version": "3.1.12", - "resolved": "https://registry.npm.taobao.org/nanoid/download/nanoid-3.1.12.tgz?cache=0&sync_timestamp=1603419433040&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnanoid%2Fdownload%2Fnanoid-3.1.12.tgz", - "integrity": "sha1-b3c2xi6NOUIWAeSgx3YjqX6mllQ=", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz", - "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" - }, - "netmask": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/netmask/download/netmask-1.0.6.tgz", - "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/next-tick/download/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", - "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-4.0.1.tgz", - "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo=", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npm.taobao.org/object-inspect/download/object-inspect-1.8.0.tgz?cache=0&sync_timestamp=1592545231350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-inspect%2Fdownload%2Fobject-inspect-1.8.0.tgz", - "integrity": "sha1-34B+Xs9TpgnMa/6T6sPMe+WzqdA=", - "dev": true - }, - "object-is": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/object-is/download/object-is-1.1.3.tgz?cache=0&sync_timestamp=1601502788762&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-is%2Fdownload%2Fobject-is-1.1.3.tgz", - "integrity": "sha1-LjueZVYBN0Ve471irsTZCi6hzIE=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz", - "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", - "dev": true - }, - "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.1.tgz?cache=0&sync_timestamp=1599844927493&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.assign%2Fdownload%2Fobject.assign-4.1.1.tgz", - "integrity": "sha1-MDhnpmbN1Bk27N7fsfjz4ypHjN0=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-5.1.2.tgz?cache=0&sync_timestamp=1597005345612&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fonetime%2Fdownload%2Fonetime-5.1.2.tgz", - "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/opencollective-postinstall/download/opencollective-postinstall-2.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fopencollective-postinstall%2Fdownload%2Fopencollective-postinstall-2.0.3.tgz", - "integrity": "sha1-eg//l49tv6TQBiOPusmO1BmMMlk=", - "dev": true - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Foptionator%2Fdownload%2Foptionator-0.8.3.tgz", - "integrity": "sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU=", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.3.0.tgz?cache=0&sync_timestamp=1594559734248&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-limit%2Fdownload%2Fp-limit-2.3.0.tgz", - "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", - "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-4.0.0.tgz", - "integrity": "sha1-uy+Vpe2i7BaOySdOBqdHw+KQTSs=", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz", - "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", - "dev": true - }, - "pac-proxy-agent": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/pac-proxy-agent/download/pac-proxy-agent-4.1.0.tgz", - "integrity": "sha1-Zog+6rrckV/F6VRXMkyw8Kx43vs=", - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4", - "get-uri": "3", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "5", - "pac-resolver": "^4.1.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "5" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", - "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" - } - } - }, - "pac-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/pac-resolver/download/pac-resolver-4.1.0.tgz?cache=0&sync_timestamp=1581134452130&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpac-resolver%2Fdownload%2Fpac-resolver-4.1.0.tgz", - "integrity": "sha1-SxLn0JayVaO4TlP2gx8y6cfl/pU=", - "requires": { - "degenerator": "^2.2.0", - "ip": "^1.1.5", - "netmask": "^1.0.6" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/parent-module/download/parent-module-1.0.1.tgz", - "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-5.1.0.tgz?cache=0&sync_timestamp=1598129182781&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-5.1.0.tgz", - "integrity": "sha1-+WCIzfJKj6qa6poAny2dlCyZlkY=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz", - "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", - "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz", - "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-4.0.0.tgz", - "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz?cache=0&sync_timestamp=1584790434095&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpicomatch%2Fdownload%2Fpicomatch-2.2.2.tgz", - "integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1602859045787&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz", - "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/please-upgrade-node/download/please-upgrade-node-3.2.0.tgz", - "integrity": "sha1-rt3T+ZTJM+StmLmdmlVu+g4v6UI=", - "dev": true, - "requires": { - "semver-compare": "^1.0.0" - } - }, - "power-assert": { - "version": "1.6.1", - "resolved": "https://registry.npm.taobao.org/power-assert/download/power-assert-1.6.1.tgz", - "integrity": "sha1-soy8Aq6Aiv0UMdDNUJOjmsWlsf4=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "empower": "^1.3.1", - "power-assert-formatter": "^1.4.1", - "universal-deep-strict-equal": "^1.2.1", - "xtend": "^4.0.0" - } - }, - "power-assert-context-formatter": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/power-assert-context-formatter/download/power-assert-context-formatter-1.2.0.tgz", - "integrity": "sha1-j75yaSKI7FpyA83yFci4OKYGHSo=", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "power-assert-context-traversal": "^1.2.0" - } - }, - "power-assert-context-reducer-ast": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/power-assert-context-reducer-ast/download/power-assert-context-reducer-ast-1.2.0.tgz", - "integrity": "sha1-x8ocnjmm+3F/esX+nnbhkr9SXfM=", - "dev": true, - "requires": { - "acorn": "^5.0.0", - "acorn-es7-plugin": "^1.0.12", - "core-js": "^2.0.0", - "espurify": "^1.6.0", - "estraverse": "^4.2.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-5.7.4.tgz", - "integrity": "sha1-Po2KmUfQWZoXltECJddDL0pKz14=", - "dev": true - } - } - }, - "power-assert-context-traversal": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/power-assert-context-traversal/download/power-assert-context-traversal-1.2.0.tgz", - "integrity": "sha1-9ucUVLr2QN5cHJwnA0n1yasLLpQ=", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "estraverse": "^4.1.0" - } - }, - "power-assert-formatter": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/power-assert-formatter/download/power-assert-formatter-1.4.1.tgz", - "integrity": "sha1-XcEl7VCj37HdomwZNH879Y7CiEo=", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "power-assert-context-formatter": "^1.0.7", - "power-assert-context-reducer-ast": "^1.0.7", - "power-assert-renderer-assertion": "^1.0.7", - "power-assert-renderer-comparison": "^1.0.7", - "power-assert-renderer-diagram": "^1.0.7", - "power-assert-renderer-file": "^1.0.7" - } - }, - "power-assert-renderer-assertion": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/power-assert-renderer-assertion/download/power-assert-renderer-assertion-1.2.0.tgz", - "integrity": "sha1-Pbb/zaEGs3vB4GQyrQ10imgrFHo=", - "dev": true, - "requires": { - "power-assert-renderer-base": "^1.1.1", - "power-assert-util-string-width": "^1.2.0" - } - }, - "power-assert-renderer-base": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/power-assert-renderer-base/download/power-assert-renderer-base-1.1.1.tgz", - "integrity": "sha1-lqZQxv0F7hvB9mtUrWFELIs/Y+s=", - "dev": true - }, - "power-assert-renderer-comparison": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/power-assert-renderer-comparison/download/power-assert-renderer-comparison-1.2.0.tgz", - "integrity": "sha1-5PiBEyJaab6KpYbq0FrvmUYsBJU=", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "diff-match-patch": "^1.0.0", - "power-assert-renderer-base": "^1.1.1", - "stringifier": "^1.3.0", - "type-name": "^2.0.1" - } - }, - "power-assert-renderer-diagram": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/power-assert-renderer-diagram/download/power-assert-renderer-diagram-1.2.0.tgz", - "integrity": "sha1-N/ZuhULlZ3xbWObXKwHA2aMOIhk=", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "power-assert-renderer-base": "^1.1.1", - "power-assert-util-string-width": "^1.2.0", - "stringifier": "^1.3.0" - } - }, - "power-assert-renderer-file": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/power-assert-renderer-file/download/power-assert-renderer-file-1.2.0.tgz", - "integrity": "sha1-P0vr2eFFXXXPKsVB57tRWofUzks=", - "dev": true, - "requires": { - "power-assert-renderer-base": "^1.1.1" - } - }, - "power-assert-util-string-width": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/power-assert-util-string-width/download/power-assert-util-string-width-1.2.0.tgz", - "integrity": "sha1-bgbV41gbuHbF03fFMQn/+pW9kaA=", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prettier": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/prettier/download/prettier-2.1.2.tgz?cache=0&sync_timestamp=1600215482255&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fprettier%2Fdownload%2Fprettier-2.1.2.tgz", - "integrity": "sha1-MFBwDa4uTItnxMP2Zs24r0BeHOU=", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/prettier-linter-helpers/download/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha1-0j1B/hN1ZG3i0BBNNFSjAIgCz3s=", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz", - "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", - "dev": true - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz", - "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=", - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", - "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", - "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz", - "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", - "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz", - "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz", - "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz?cache=0&sync_timestamp=1581624324274&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.5.0.tgz?cache=0&sync_timestamp=1602584331621&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-3.5.0.tgz", - "integrity": "sha1-m6dMAZsV02UnjS6Ru4xI17TULJ4=", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/regexp.prototype.flags/download/regexp.prototype.flags-1.3.0.tgz?cache=0&sync_timestamp=1576388141321&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexp.prototype.flags%2Fdownload%2Fregexp.prototype.flags-1.3.0.tgz", - "integrity": "sha1-erqJs8E6ZFCdq888qNn7ub31y3U=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npm.taobao.org/es-abstract/download/es-abstract-1.17.7.tgz?cache=0&sync_timestamp=1601502719982&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fes-abstract%2Fdownload%2Fes-abstract-1.17.7.tgz", - "integrity": "sha1-pN5hsvZpifx0IWdsHLl4dXOs5Uw=", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/regexpp/download/regexpp-3.1.0.tgz", - "integrity": "sha1-IG0K0KVkjP+9uK5GQ489xRyfeOI=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz", - "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz", - "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-3.1.0.tgz", - "integrity": "sha1-OfZ8VLOnpYzqUjbZXPADQjljH34=", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/reusify/download/reusify-1.0.4.tgz", - "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz", - "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npm.taobao.org/run-parallel/download/run-parallel-1.1.9.tgz", - "integrity": "sha1-yd06fPn0ssS2JE4XOm7YZuYd1nk=", - "dev": true - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npm.taobao.org/rxjs/download/rxjs-6.6.3.tgz?cache=0&sync_timestamp=1602770834162&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frxjs%2Fdownload%2Frxjs-6.6.3.tgz", - "integrity": "sha1-jKhGNcTaqQDA05Z6buesYCce5VI=", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.14.1.tgz", - "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", - "dev": true - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.3.2.tgz", - "integrity": "sha1-YElisFK4HtB4aq6EOJ/7pw/9OTg=", - "dev": true - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/semver-compare/download/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true - }, - "semver-regex": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/semver-regex/download/semver-regex-2.0.0.tgz", - "integrity": "sha1-qTwsWERTmncCMzeRB7OMe0rJ0zg=", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz", - "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" - } - } - }, - "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-5.0.1.tgz?cache=0&sync_timestamp=1599740650381&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fserialize-javascript%2Fdownload%2Fserialize-javascript-5.0.1.tgz", - "integrity": "sha1-eIbshIBJpGJGepfT2Rjrsqr5NPQ=", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz", - "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz", - "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz", - "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz", - "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz", - "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/slash/download/slash-3.0.0.tgz", - "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz", - "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/smart-buffer/download/smart-buffer-4.1.0.tgz", - "integrity": "sha1-kWBcJdkWUvRmHqacz0XxszHKIbo=" - }, - "socks": { - "version": "2.4.4", - "resolved": "https://registry.npm.taobao.org/socks/download/socks-2.4.4.tgz?cache=0&sync_timestamp=1599605506578&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsocks%2Fdownload%2Fsocks-2.4.4.tgz", - "integrity": "sha1-8aM4LngUrijJe7gqOLwawkshzKI=", - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/socks-proxy-agent/download/socks-proxy-agent-5.0.0.tgz?cache=0&sync_timestamp=1580845554635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsocks-proxy-agent%2Fdownload%2Fsocks-proxy-agent-5.0.0.tgz", - "integrity": "sha1-fA82Tnsc9KekN+cSU77XLpAEvmA=", - "requires": { - "agent-base": "6", - "debug": "4", - "socks": "^2.3.3" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", - "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1571657176668&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "optional": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.4.18.tgz?cache=0&sync_timestamp=1587719289626&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.4.18.tgz", - "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", - "dev": true, - "requires": { - "source-map": "^0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz?cache=0&sync_timestamp=1571657176668&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz?cache=0&sync_timestamp=1587327902535&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstatuses%2Fdownload%2Fstatuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/streamsearch/download/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npm.taobao.org/string-argv/download/string-argv-0.3.1.tgz", - "integrity": "sha1-leL77AQnrhkYSTX4FtdKqkxcGdo=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/string.prototype.trimend/download/string.prototype.trimend-1.0.2.tgz?cache=0&sync_timestamp=1603219618123&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimend%2Fdownload%2Fstring.prototype.trimend-1.0.2.tgz", - "integrity": "sha1-bd2ah5a8cUtImjriIkaiCPN7+kY=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "string.prototype.trimstart": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/string.prototype.trimstart/download/string.prototype.trimstart-1.0.2.tgz?cache=0&sync_timestamp=1603219618047&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimstart%2Fdownload%2Fstring.prototype.trimstart-1.0.2.tgz", - "integrity": "sha1-ItRdqBAVMJzQzdeXh+iRn8XGE+c=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "stringifier": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/stringifier/download/stringifier-1.4.0.tgz", - "integrity": "sha1-1wRYFWf0UmJl0A7Y7LNUoCw/7Cg=", - "dev": true, - "requires": { - "core-js": "^2.0.0", - "traverse": "^0.6.6", - "type-name": "^2.0.1" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npm.taobao.org/stringify-object/download/stringify-object-3.3.0.tgz", - "integrity": "sha1-cDBlrvyhkwDTzoivT1s5VtdVZik=", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.0.tgz", - "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/strip-comments/download/strip-comments-2.0.1.tgz", - "integrity": "sha1-StEcP7ysF3pnpArCJMoznKHBups=" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/strip-final-newline/download/strip-final-newline-2.0.0.tgz", - "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0=", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-3.1.1.tgz?cache=0&sync_timestamp=1594567532500&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-json-comments%2Fdownload%2Fstrip-json-comments-3.1.1.tgz", - "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1598611709087&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npm.taobao.org/table/download/table-5.4.6.tgz", - "integrity": "sha1-EpLRlQDOP4YFOwXw6Ofko7shB54=", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", - "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz", - "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npm.taobao.org/traverse/download/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", - "dev": true - }, - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-2.0.3.tgz", - "integrity": "sha1-jgdBrEX8DCJuWKF7/D5kubxsphw=" - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npm.taobao.org/tsutils/download/tsutils-3.17.1.tgz", - "integrity": "sha1-7XGZF/EcoN7lhicrKsSeAVot11k=", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.14.1.tgz", - "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", - "dev": true - } - } - }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npm.taobao.org/tunnel/download/tunnel-0.0.6.tgz", - "integrity": "sha1-cvExSzSlsZLbASMk3yzFh8pH+Sw=" - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/type/download/type-1.2.0.tgz?cache=0&sync_timestamp=1598016585110&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype%2Fdownload%2Ftype-1.2.0.tgz", - "integrity": "sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz", - "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "type-name": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/type-name/download/type-name-2.0.2.tgz", - "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=", - "dev": true - }, - "typescript": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/typescript/download/typescript-4.0.3.tgz?cache=0&sync_timestamp=1603608626888&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftypescript%2Fdownload%2Ftypescript-4.0.3.tgz", - "integrity": "sha1-FTu9Ro7wdyXB35x36LRT+NNqu6U=", - "dev": true - }, - "universal-deep-strict-equal": { - "version": "1.2.2", - "resolved": "https://registry.npm.taobao.org/universal-deep-strict-equal/download/universal-deep-strict-equal-1.2.2.tgz", - "integrity": "sha1-DaSsL3PP95JMgfpN4BjKViyisKc=", - "dev": true, - "requires": { - "array-filter": "^1.0.0", - "indexof": "0.0.1", - "object-keys": "^1.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz?cache=0&sync_timestamp=1603179967633&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-0.1.2.tgz", - "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.0.tgz?cache=0&sync_timestamp=1598814377097&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.0.tgz", - "integrity": "sha1-qnFCYd55PoqCNHp7zJznTobyhgI=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.1.1.tgz", - "integrity": "sha1-VLw83UMxe8qR413K8wWxpyN950U=", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz?cache=0&sync_timestamp=1574116720213&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-2.0.2.tgz", - "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/which-pm-runs/download/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/wide-align/download/wide-align-1.1.3.tgz", - "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz", - "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=" - }, - "workerpool": { - "version": "6.0.2", - "resolved": "https://registry.npm.taobao.org/workerpool/download/workerpool-6.0.2.tgz", - "integrity": "sha1-4kG0PY0DPxvrUseFEGlFYDnR1Dg=", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz", - "integrity": "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839122515&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", - "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", - "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1603212180491&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz", - "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz", - "integrity": "sha1-lSGCxGzHssMT0VluYjmSvRY7crU=", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/write/download/write-1.0.3.tgz", - "integrity": "sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/xregexp/download/xregexp-2.0.0.tgz?cache=0&sync_timestamp=1581429204252&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxregexp%2Fdownload%2Fxregexp-2.0.0.tgz", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz", - "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz", - "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", - "dev": true - }, - "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npm.taobao.org/yaml/download/yaml-1.10.0.tgz", - "integrity": "sha1-O1k63ZRIdgd9TWg/7gEIG9n/8x4=", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-13.3.2.tgz?cache=0&sync_timestamp=1602805561021&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-13.3.2.tgz", - "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0=", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz?cache=0&sync_timestamp=1597169842138&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-13.1.2.tgz?cache=0&sync_timestamp=1602861397132&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-13.1.2.tgz", - "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg=", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/yargs-unparser/download/yargs-unparser-2.0.0.tgz", - "integrity": "sha1-8TH5ImkRrl2a04xDL+gJNmwjJes=", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.1.0", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-6.1.0.tgz?cache=0&sync_timestamp=1602350083472&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-6.1.0.tgz", - "integrity": "sha1-J9wXYXNyX7Ct+KSLZH9NeHGUTXg=", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-4.0.0.tgz", - "integrity": "sha1-qkcte/Zg6xXzSU79UxyrfypwmDc=", - "dev": true - } - } - } - } -} diff --git a/netease_api/package.json b/netease_api/package.json deleted file mode 100644 index 7dba2ab..0000000 --- a/netease_api/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "NeteaseCloudMusicApi", - "version": "3.45.2", - "description": "网易云音乐 NodeJS 版 API", - "scripts": { - "start": "node app.js", - "test": "mocha -r intelli-espower-loader -t 20000 app.test.js --exit", - "lint": "eslint **/*.{js,ts}", - "lint-fix": "eslint --fix **/*.{js,ts}" - }, - "keywords": [ - "网易云音乐", - "网易云", - "音乐", - "网易云音乐nodejs" - ], - "main": "main.js", - "types": "./interface.d.ts", - "engines": { - "node": ">=12" - }, - "author": "binaryify", - "license": "MIT", - "files": [ - "module", - "util", - "plugins", - "main.d.ts", - "interface.d.ts", - "module_types" - ], - "dependencies": { - "axios": "^0.20.0", - "express": "^4.17.1", - "express-fileupload": "^1.1.9", - "pac-proxy-agent": "^4.0.0", - "strip-comments": "^2.0.1", - "tunnel": "^0.0.6" - }, - "devDependencies": { - "@types/node": "14.11.10", - "@typescript-eslint/eslint-plugin": "4.4.1", - "@typescript-eslint/parser": "4.4.1", - "eslint": "7.12.0", - "eslint-config-prettier": "6.13.0", - "eslint-plugin-html": "6.0.3", - "eslint-plugin-prettier": "3.1.4", - "intelli-espower-loader": "1.0.1", - "mocha": "8.2.0", - "power-assert": "1.6.1", - "prettier": "2.1.2", - "typescript": "4.0.3" - } -} diff --git a/netease_api/plugins/upload.js b/netease_api/plugins/upload.js deleted file mode 100644 index f572759..0000000 --- a/netease_api/plugins/upload.js +++ /dev/null @@ -1,48 +0,0 @@ -const axios = require('axios'); -module.exports = async (query, request) => { - const data = { - bucket: 'yyimgs', - ext: 'jpg', - filename: query.imgFile.name, - local: false, - nos_product: 0, - return_body: `{"code":200,"size":"$(ObjectSize)"}`, - type: 'other', - }; - // 获取key和token - const res = await request( - 'POST', - `https://music.163.com/weapi/nos/token/alloc`, - data, - { crypto: 'weapi', cookie: query.cookie, proxy: query.proxy }, - ); - // 上传图片 - const res2 = await axios({ - method: 'post', - url: `https://nosup-hz1.127.net/yyimgs/${res.body.result.objectKey}?offset=0&complete=true&version=1.0`, - headers: { - 'x-nos-token': res.body.result.token, - 'Content-Type': 'image/jpeg', - }, - data: query.imgFile.data, - }); - // 获取裁剪后图片的id - const imgSize = query.imgSize || 300; - const imgX = query.imgX || 0; - const imgY = query.imgY || 0; - const res3 = await request( - 'POST', - `https://music.163.com/upload/img/op?id=${res.body.result.docId}&op=${imgX}y${imgY}y${imgSize}y${imgSize}`, - {}, - { crypto: 'weapi', cookie: query.cookie, proxy: query.proxy }, - ); - - return { - // ...res.body.result, - // ...res2.data, - // ...res3.body, - url_pre: 'https://p1.music.126.net/' + res.body.result.objectKey, - url: res3.body.url, - imgId: res3.body.id, - }; -}; diff --git a/netease_api/public/avatar_update.html b/netease_api/public/avatar_update.html deleted file mode 100644 index 41dd8e9..0000000 --- a/netease_api/public/avatar_update.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - 更新头像 - - - - - - - - - diff --git a/netease_api/public/index.html b/netease_api/public/index.html deleted file mode 100644 index 21c33b6..0000000 --- a/netease_api/public/index.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - 网易云音乐 API - - - -

网易云音乐 API

- 当你看到这个页面时,这个服务已经成功跑起来了~ -
查看文档 -

例子:

- - - - diff --git a/netease_api/public/playlist_cover_update.html b/netease_api/public/playlist_cover_update.html deleted file mode 100644 index d09be2c..0000000 --- a/netease_api/public/playlist_cover_update.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - 歌单封面上传 - - - - - - - - - diff --git a/netease_api/public/test.html b/netease_api/public/test.html deleted file mode 100644 index 64da33f..0000000 --- a/netease_api/public/test.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - test - - - -

请在控制台看结果

- - - - - diff --git a/netease_api/renovate.json b/netease_api/renovate.json deleted file mode 100644 index 4f39080..0000000 --- a/netease_api/renovate.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["config:base"] -} diff --git a/netease_api/routes/index.js b/netease_api/routes/index.js deleted file mode 100644 index 2ce4e88..0000000 --- a/netease_api/routes/index.js +++ /dev/null @@ -1,8810 +0,0 @@ -const { cookieToJson } = require('../util/index'); -const request = require('../util/request'); -module.exports = { - '/yunbei/today': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const yunbei_today = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/point/today/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - yunbei_today(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/yunbei/tasks/todo': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const yunbei_tasks_todo = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/usertool/task/todo/query`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - yunbei_tasks_todo(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/yunbei/tasks': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const yunbei_tasks = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/usertool/task/list/all`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - yunbei_tasks(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/yunbei/task/finish': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const yunbei_task_finish = (query, request) => { - const data = { - userTaskId: query.userTaskId, - depositCode: query.depositCode || '0', - }; - return request( - 'POST', - `https://music.163.com/api/usertool/task/point/receive`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - yunbei_task_finish(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/yunbei/sign': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const yunbei_sign = (query, request) => { - const data = { type: '0' }; - return request( - 'POST', - `https://music.163.com/api/point/dailyTask`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - yunbei_sign(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/yunbei/receipt': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const yunbei_receipt = (query, request) => { - const data = { limit: query.limit || 10, offset: query.offset || 0 }; - return request( - 'POST', - `https://music.163.com/store/api/point/receipt`, - data, - { - crypto: 'api', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - yunbei_receipt(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/yunbei/info': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const yunbei_info = (query, request) => { - const data = {}; - return request('POST', `https://music.163.com/api/v1/user/info`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - yunbei_info(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/yunbei/expense': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const yunbei_expense = (query, request) => { - const data = { limit: query.limit || 10, offset: query.offset || 0 }; - return request( - 'POST', - `https://music.163.com/store/api/point/expense`, - data, - { - crypto: 'api', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - yunbei_expense(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/yunbei': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const yunbei = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/point/signed/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - yunbei(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/weblog': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const weblog = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/feedback/weblog`, - query.data || {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - weblog(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/video/url': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const video_url = (query, request) => { - const data = { - ids: '["' + query.id + '"]', - resolution: query.res || 1080, - }; - return request( - 'POST', - `https://music.163.com/weapi/cloudvideo/playurl`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - video_url(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/video/timeline/recommend': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const video_timeline_recommend = (query, request) => { - const data = { - offset: query.offset || 0, - filterLives: '[]', - withProgramInfo: 'true', - needUrl: '1', - resolution: '480', - }; - return request( - 'POST', - `https://music.163.com/api/videotimeline/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - video_timeline_recommend(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/video/timeline/all': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const video_timeline_all = (query, request) => { - const data = { - groupId: 0, - offset: query.offset || 0, - need_preview_url: 'true', - total: true, - }; - return request( - 'POST', - `https://music.163.com/api/videotimeline/otherclient/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - video_timeline_all(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/video/sub': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const video_sub = (query, request) => { - query.t = query.t == 1 ? 'sub' : 'unsub'; - const data = { id: query.id }; - return request( - 'POST', - `https://music.163.com/weapi/cloudvideo/video/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - video_sub(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/video/group/list': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const video_group_list = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/cloudvideo/group/list`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - video_group_list(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/video/group': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const video_group = (query, request) => { - const data = { - groupId: query.id, - offset: query.offset || 0, - need_preview_url: 'true', - total: true, - }; - return request( - 'POST', - `https://music.163.com/api/videotimeline/videogroup/otherclient/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - video_group(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/video/detail/info': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const video_detail_info = (query, request) => { - const data = { threadid: `R_VI_62_${query.vid}`, composeliked: true }; - return request( - 'POST', - `https://music.163.com/api/comment/commentthread/info`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - video_detail_info(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/video/detail': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const video_detail = (query, request) => { - const data = { id: query.id }; - return request( - 'POST', - `https://music.163.com/weapi/cloudvideo/v1/video/detail`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - video_detail(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/video/category/list': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const video_category_list = (query, request) => { - const data = { - offset: query.offset || 0, - total: 'true', - limit: query.limit || 99, - }; - return request( - 'POST', - `https://music.163.com/api/cloudvideo/category/list`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - video_category_list(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/update': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_update = (query, request) => { - const data = { - avatarImgId: '0', - birthday: query.birthday, - city: query.city, - gender: query.gender, - nickname: query.nickname, - province: query.province, - signature: query.signature, - }; - return request( - 'POST', - `https://music.163.com/weapi/user/profile/update`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - user_update(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/subcount': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_subcount = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/subcount`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - user_subcount(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/replacephone': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_replacephone = (query, request) => { - const data = { - phone: query.phone, - captcha: query.captcha, - oldcaptcha: query.oldcaptcha, - countrycode: query.countrycode || '86', - }; - return request( - 'POST', - `https://music.163.com/api/user/replaceCellphone`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - user_replacephone(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/record': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_record = (query, request) => { - const data = { uid: query.uid, type: query.type || 0 }; - return request( - 'POST', - `https://music.163.com/weapi/v1/play/record`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - user_record(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/playlist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_playlist = (query, request) => { - const data = { - uid: query.uid, - limit: query.limit || 30, - offset: query.offset || 0, - includeVideo: true, - }; - return request('POST', `https://music.163.com/api/user/playlist`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - user_playlist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/level': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_level = (query, request) => { - const data = {}; - return request('POST', `https://music.163.com/weapi/user/level`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - user_level(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/follows': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_follows = (query, request) => { - const data = { - offset: query.offset || 0, - limit: query.limit || 30, - order: true, - }; - return request( - 'POST', - `https://music.163.com/weapi/user/getfollows/${query.uid}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - user_follows(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/followeds': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_followeds = (query, request) => { - const data = { - userId: query.uid, - time: query.lasttime || -1, - limit: query.limit || 30, - }; - return request( - 'POST', - `https://music.163.com/eapi/user/getfolloweds/${query.uid}`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/user/getfolloweds', - realIP: query.realIP, - }, - ); - }; - user_followeds(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/event': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_event = (query, request) => { - const data = { - getcounts: true, - time: query.lasttime || -1, - limit: query.limit || 30, - total: false, - }; - return request( - 'POST', - `https://music.163.com/weapi/event/get/${query.uid}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - user_event(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/dj': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_dj = (query, request) => { - const data = { limit: query.limit || 30, offset: query.offset || 0 }; - return request( - 'POST', - `https://music.163.com/weapi/dj/program/${query.uid}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - user_dj(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/detail': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_detail = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/v1/user/detail/${query.uid}`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - user_detail(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/cloud/detail': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_cloud_detail = (query, request) => { - const id = query.id.replace(/\s/g, '').split(','); - const data = { songIds: id }; - return request( - 'POST', - `https://music.163.com/weapi/v1/cloud/get/byids`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - user_cloud_detail(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/cloud/del': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_cloud_del = (query, request) => { - const data = { songIds: [query.id] }; - return request('POST', `https://music.163.com/weapi/cloud/del`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - user_cloud_del(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/cloud': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_cloud = (query, request) => { - const data = { limit: query.limit || 30, offset: query.offset || 0 }; - return request('POST', `https://music.163.com/weapi/v1/cloud/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - user_cloud(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/binding': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_binding = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/v1/user/bindings/${query.uid}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - user_binding(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/audio': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_audio = (query, request) => { - const data = { userId: query.uid }; - return request( - 'POST', - `https://music.163.com/weapi/djradio/get/byuser`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - user_audio(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/user/account': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const user_account = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/nuser/account/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - user_account(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/toplist/detail': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const toplist_detail = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/toplist/detail`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - toplist_detail(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/toplist/artist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const toplist_artist = (query, request) => { - const data = { - type: query.type || 1, - limit: 100, - offset: 0, - total: true, - }; - return request( - 'POST', - `https://music.163.com/weapi/toplist/artist`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - toplist_artist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/toplist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const toplist = (query, request) => { - return request( - 'POST', - `https://music.163.com/api/toplist`, - {}, - { - crypto: 'linuxapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - toplist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/top/song': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const top_song = (query, request) => { - const data = { areaId: query.type || 0, total: true }; - return request( - 'POST', - `https://music.163.com/weapi/v1/discovery/new/songs`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - top_song(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/top/playlist/highquality': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const top_playlist_highquality = (query, request) => { - const data = { - cat: query.cat || '全部', - limit: query.limit || 50, - lasttime: query.before || 0, - total: true, - }; - return request( - 'POST', - `https://music.163.com/api/playlist/highquality/list`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - top_playlist_highquality(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/top/playlist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const top_playlist = (query, request) => { - const data = { - cat: query.cat || '全部', - order: query.order || 'hot', - limit: query.limit || 50, - offset: query.offset || 0, - total: true, - }; - return request( - 'POST', - `https://music.163.com/weapi/playlist/list`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - top_playlist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/top/mv': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const top_mv = (query, request) => { - const data = { - area: query.area || '', - limit: query.limit || 30, - offset: query.offset || 0, - total: true, - }; - return request('POST', `https://music.163.com/weapi/mv/toplist`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - top_mv(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/top/list': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const top_list = (query, request) => { - query.cookie.os = 'pc'; - if (query.idx) { - return Promise.resolve({ - status: 500, - body: { code: 500, msg: '不支持此方式调用,只支持id调用' }, - }); - } - const data = { id: query.id, n: '500', s: '0' }; - return request( - 'POST', - `https://interface3.music.163.com/api/playlist/v4/detail`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - top_list(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/top/artists': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const top_artists = (query, request) => { - const data = { - limit: query.limit || 50, - offset: query.offset || 0, - total: true, - }; - return request('POST', `https://music.163.com/weapi/artist/top`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - top_artists(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/top/album': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const top_album = (query, request) => { - const date = new Date(); - const data = { - area: query.area || 'ALL', - limit: query.limit || 50, - offset: query.offset || 0, - type: query.type || 'new', - year: query.year || date.getFullYear(), - month: query.month || date.getMonth() + 1, - total: false, - rcmd: true, - }; - return request( - 'POST', - `https://music.163.com/api/discovery/new/albums/area`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - top_album(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/song/url': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const song_url = (query, request) => { - if (!('MUSIC_U' in query.cookie)) - query.cookie._ntes_nuid = crypto.randomBytes(16).toString('hex'); - query.cookie.os = 'pc'; - const data = { - ids: '[' + query.id + ']', - br: parseInt(query.br || 999000), - }; - return request( - 'POST', - `https://interface3.music.163.com/eapi/song/enhance/player/url`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - url: '/api/song/enhance/player/url', - }, - ); - }; - song_url(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/song/order/update': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const song_order_update = (query, request) => { - const data = { pid: query.pid, trackIds: query.ids, op: 'update' }; - return request( - 'POST', - `http://interface.music.163.com/api/playlist/manipulate/tracks`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/playlist/desc/update', - realIP: query.realIP, - }, - ); - }; - song_order_update(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/song/detail': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const song_detail = (query, request) => { - query.ids = query.ids.split(/\s*,\s*/); - const data = { - c: '[' + query.ids.map((id) => '{"id":' + id + '}').join(',') + ']', - ids: '[' + query.ids.join(',') + ']', - }; - return request( - 'POST', - `https://music.163.com/weapi/v3/song/detail`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - song_detail(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/simi/user': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const simi_user = (query, request) => { - const data = { - songid: query.id, - limit: query.limit || 50, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/discovery/simiUser`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - simi_user(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/simi/song': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const simi_song = (query, request) => { - const data = { - songid: query.id, - limit: query.limit || 50, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/discovery/simiSong`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - simi_song(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/simi/playlist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const simi_playlist = (query, request) => { - const data = { - songid: query.id, - limit: query.limit || 50, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/discovery/simiPlaylist`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - simi_playlist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/simi/mv': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const simi_mv = (query, request) => { - const data = { mvid: query.mvid }; - return request( - 'POST', - `https://music.163.com/weapi/discovery/simiMV`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - simi_mv(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/simi/artist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const simi_artist = (query, request) => { - const data = { artistid: query.id }; - return request( - 'POST', - `https://music.163.com/weapi/discovery/simiArtist`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - simi_artist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/share/resource': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const share_resource = (query, request) => { - const data = { - type: query.type || 'song', - msg: query.msg || '', - id: query.id || '', - }; - return request( - 'POST', - `https://music.163.com/weapi/share/friends/resource`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - share_resource(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/setting': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const setting = (query, request) => { - const data = {}; - return request('POST', `https://music.163.com/api/user/setting`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - setting(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/send/text': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const send_text = (query, request) => { - query.cookie.os = 'pc'; - const data = { - type: 'text', - msg: query.msg, - userIds: '[' + query.user_ids + ']', - }; - return request( - 'POST', - `https://music.163.com/weapi/msg/private/send`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - send_text(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/send/playlist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const send_playlist = (query, request) => { - query.cookie.os = 'pc'; - const data = { - id: query.playlist, - type: 'playlist', - msg: query.msg, - userIds: '[' + query.user_ids + ']', - }; - return request( - 'POST', - `https://music.163.com/weapi/msg/private/send`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - send_playlist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/search/suggest': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const search_suggest = (query, request) => { - const data = { s: query.keywords || '' }; - let type = query.type == 'mobile' ? 'keyword' : 'web'; - return request( - 'POST', - `https://music.163.com/weapi/search/suggest/` + type, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - search_suggest(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/search/multimatch': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const search_multimatch = (query, request) => { - const data = { type: query.type || 1, s: query.keywords || '' }; - return request( - 'POST', - `https://music.163.com/weapi/search/suggest/multimatch`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - search_multimatch(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/search/hot/detail': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const search_hot_detail = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/weapi/hotsearchlist/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - search_hot_detail(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/search/hot': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const search_hot = (query, request) => { - const data = { type: 1111 }; - return request('POST', `https://music.163.com/weapi/search/hot`, data, { - crypto: 'weapi', - ua: 'mobile', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - search_hot(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/search/default': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const search_default = (query, request) => { - return request( - 'POST', - `https://interface3.music.163.com/eapi/search/defaultkeyword/get`, - {}, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/search/defaultkeyword/get', - realIP: query.realIP, - }, - ); - }; - search_default(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/search': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const search = (query, request) => { - const data = { - s: query.keywords, - type: query.type || 1, - limit: query.limit || 30, - offset: query.offset || 0, - }; - return request('POST', `https://music.163.com/weapi/search/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - search(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/scrobble': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const scrobble = (query, request) => { - const data = { - logs: JSON.stringify([ - { - action: 'play', - json: { - download: 0, - end: 'playend', - id: query.id, - sourceId: query.sourceid, - time: query.time, - type: 'song', - wifi: 0, - }, - }, - ]), - }; - return request( - 'POST', - `https://music.163.com/weapi/feedback/weblog`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - scrobble(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/resource/like': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const resource_like = (query, request) => { - query.cookie.os = 'pc'; - query.t = query.t == 1 ? 'like' : 'unlike'; - query.type = { 1: 'R_MV_5_', 4: 'A_DJ_1_', 5: 'R_VI_62_', 6: 'A_EV_2_' }[ - query.type - ]; - const data = { threadId: query.type + query.id }; - if (query.type === 'A_EV_2_') { - data.threadId = query.threadId; - } - return request( - 'POST', - `https://music.163.com/weapi/resource/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - resource_like(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/related/allvideo': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const related_allvideo = (query, request) => { - const data = { id: query.id, type: /^\\d+$/.test(query.id) ? 0 : 1 }; - return request( - 'POST', - `https://music.163.com/weapi/cloudvideo/v1/allvideo/rcmd`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - related_allvideo(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/register/cellphone': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const register_cellphone = (query, request) => { - query.cookie.os = 'pc'; - const data = { - captcha: query.captcha, - phone: query.phone, - password: crypto.createHash('md5').update(query.password).digest('hex'), - nickname: query.nickname, - }; - return request( - 'POST', - `https://music.163.com/api/register/cellphone`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - register_cellphone(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/recommend/songs': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const recommend_songs = (query, request) => { - query.cookie.os = 'ios'; - const data = {}; - return request( - 'POST', - `https://music.163.com/api/v3/discovery/recommend/songs`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - recommend_songs(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/recommend/resource': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const recommend_resource = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/v1/discovery/recommend/resource`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - recommend_resource(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/rebind': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const rebind = (query, request) => { - const data = { - captcha: query.captcha, - phone: query.phone, - oldcaptcha: query.oldcaptcha, - ctcode: query.ctcode || '86', - }; - return request( - 'POST', - `https://music.163.com/api/user/replaceCellphone`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - rebind(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/program/recommend': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const program_recommend = (query, request) => { - const data = { - cateId: query.type, - limit: query.limit || 10, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/program/recommend/v1`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - program_recommend(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playmode/intelligence/list': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playmode_intelligence_list = (query, request) => { - const data = { - songId: query.id, - type: 'fromPlayOne', - playlistId: query.pid, - startMusicId: query.sid || query.id, - count: query.count || 1, - }; - return request( - 'POST', - `https://music.163.com/weapi/playmode/intelligence/list`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - playmode_intelligence_list(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/video/recent': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_video_recent = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/playlist/video/recent`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - playlist_video_recent(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/update': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_update = (query, request) => { - query.cookie.os = 'pc'; - query.desc = query.desc || ''; - query.tags = query.tags || ''; - const data = { - '/api/playlist/desc/update': `{\"id\":${query.id},\"desc\":\"${query.desc}\"}`, - '/api/playlist/tags/update': `{\"id\":${query.id},\"tags\":\"${query.tags}\"}`, - '/api/playlist/update/name': `{\"id\":${query.id},\"name\":\"${query.name}\"}`, - }; - return request('POST', `https://music.163.com/weapi/batch`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - playlist_update(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/tracks': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_tracks = async (query, request) => { - query.cookie.os = 'pc'; - const tracks = query.tracks.split(','); - const data = { - op: query.op, - pid: query.pid, - trackIds: JSON.stringify(tracks), - imme: 'true', - }; - try { - const res = await request( - 'POST', - `https://music.163.com/api/playlist/manipulate/tracks`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - return { status: 200, body: { ...res } }; - } catch (error) { - if (error.body.code === 512) { - return request( - 'POST', - `https://music.163.com/api/playlist/manipulate/tracks`, - { - op: query.op, - pid: query.pid, - trackIds: JSON.stringify([...tracks, ...tracks]), - imme: 'true', - }, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - } - } - }; - playlist_tracks(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/track/delete': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_track_delete = async (query, request) => { - query.cookie.os = 'pc'; - query.ids = query.ids || ''; - const data = { - id: query.id, - tracks: JSON.stringify( - query.ids.split(',').map((item) => { - return { type: 3, id: item }; - }), - ), - }; - return request( - 'POST', - `https://music.163.com/api/playlist/track/delete`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - playlist_track_delete(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/track/add': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_track_add = async (query, request) => { - query.cookie.os = 'pc'; - query.ids = query.ids || ''; - const data = { - id: query.pid, - tracks: JSON.stringify( - query.ids.split(',').map((item) => { - return { type: 3, id: item }; - }), - ), - }; - console.log(data); - return request( - 'POST', - `https://music.163.com/api/playlist/track/add`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - playlist_track_add(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/tags/update': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_tags_update = (query, request) => { - const data = { id: query.id, tags: query.tags }; - return request( - 'POST', - `https://interface3.music.163.com/eapi/playlist/tags/update`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/playlist/tags/update', - realIP: query.realIP, - }, - ); - }; - playlist_tags_update(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/subscribers': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_subscribers = (query, request) => { - const data = { - id: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/playlist/subscribers`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - playlist_subscribers(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/subscribe': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_subscribe = (query, request) => { - query.t = query.t == 1 ? 'subscribe' : 'unsubscribe'; - const data = { id: query.id }; - return request( - 'POST', - `https://music.163.com/weapi/playlist/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - playlist_subscribe(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/order/update': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_order_update = (query, request) => { - query.cookie.os = 'pc'; - const data = { ids: query.ids }; - return request( - 'POST', - `https://music.163.com/api/playlist/order/update`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - playlist_order_update(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/name/update': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_name_update = (query, request) => { - const data = { id: query.id, name: query.name }; - return request( - 'POST', - `https://interface3.music.163.com/eapi/playlist/update/name`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/playlist/update/name', - realIP: query.realIP, - }, - ); - }; - playlist_name_update(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/mylike': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_mylike = (query, request) => { - const data = { time: query.time || '-1', limit: query.limit || '12' }; - return request( - 'POST', - `https://music.163.com/api/mlog/playlist/mylike/bytime/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - playlist_mylike(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/hot': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_hot = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/playlist/hottags`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - playlist_hot(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/highquality/tags': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_highquality_tags = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/playlist/highquality/tags`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - playlist_highquality_tags(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/detail': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_detail = (query, request) => { - const data = { id: query.id, n: 100000, s: query.s || 8 }; - return request( - 'POST', - `https://music.163.com/api/v6/playlist/detail`, - data, - { - crypto: 'linuxapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - playlist_detail(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/desc/update': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_desc_update = (query, request) => { - const data = { id: query.id, desc: query.desc }; - return request( - 'POST', - `https://interface3.music.163.com/eapi/playlist/desc/update`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/playlist/desc/update', - realIP: query.realIP, - }, - ); - }; - playlist_desc_update(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/delete': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_delete = (query, request) => { - query.cookie.os = 'pc'; - const data = { ids: '[' + query.id + ']' }; - return request( - 'POST', - `https://music.163.com/weapi/playlist/remove`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - playlist_delete(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/create': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_create = (query, request) => { - query.cookie.os = 'pc'; - const data = { - name: query.name, - privacy: query.privacy, - type: query.type || 'NORMAL', - }; - return request( - 'POST', - `https://music.163.com/api/playlist/create`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - playlist_create(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/cover/update': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_cover_update = async (query, request) => { - const uploadInfo = await uploadPlugin(query, request); - const res = await request( - 'POST', - `https://music.163.com/weapi/playlist/cover/update`, - { id: query.id, coverImgId: uploadInfo.imgId }, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - return { - status: 200, - body: { code: 200, data: { ...uploadInfo, ...res.body } }, - }; - }; - playlist_cover_update(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/playlist/catlist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const playlist_catlist = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/playlist/catalogue`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - playlist_catlist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/personalized/privatecontent/list': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const personalized_privatecontent_list = (query, request) => { - const data = { - offset: query.offset || 0, - total: 'true', - limit: query.limit || 60, - }; - return request( - 'POST', - `https://music.163.com/api/v2/privatecontent/list`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - personalized_privatecontent_list(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/personalized/privatecontent': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const personalized_privatecontent = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/personalized/privatecontent`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - personalized_privatecontent(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/personalized/newsong': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const personalized_newsong = (query, request) => { - const data = { - type: 'recommend', - limit: query.limit || 10, - areaId: query.areaId || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/personalized/newsong`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - personalized_newsong(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/personalized/mv': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const personalized_mv = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/personalized/mv`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - personalized_mv(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/personalized/djprogram': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const personalized_djprogram = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/personalized/djprogram`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - personalized_djprogram(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/personalized': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const personalized = (query, request) => { - const data = { limit: query.limit || 30, total: true, n: 1000 }; - return request( - 'POST', - `https://music.163.com/weapi/personalized/playlist`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - personalized(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/personal_fm': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const personal_fm = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/v1/radio/get`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - personal_fm(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/mv/url': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const mv_url = (query, request) => { - const data = { id: query.id, r: query.r || 1080 }; - return request( - 'POST', - `https://music.163.com/weapi/song/enhance/play/mv/url`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - mv_url(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/mv/sublist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const mv_sublist = (query, request) => { - const data = { - limit: query.limit || 25, - offset: query.offset || 0, - total: true, - }; - return request( - 'POST', - `https://music.163.com/weapi/cloudvideo/allvideo/sublist`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - mv_sublist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/mv/sub': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const mv_sub = (query, request) => { - query.t = query.t == 1 ? 'sub' : 'unsub'; - const data = { mvId: query.mvid, mvIds: '["' + query.mvid + '"]' }; - return request( - 'POST', - `https://music.163.com/weapi/mv/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - mv_sub(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/mv/first': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const mv_first = (query, request) => { - const data = { - area: query.area || '', - limit: query.limit || 30, - total: true, - }; - return request( - 'POST', - `https://interface.music.163.com/weapi/mv/first`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - mv_first(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/mv/exclusive/rcmd': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const mv_exclusive_rcmd = (query, request) => { - const data = { offset: query.offset || 0, limit: query.limit || 30 }; - return request( - 'POST', - `https://interface.music.163.com/api/mv/exclusive/rcmd`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - mv_exclusive_rcmd(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/mv/detail/info': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const mv_detail_info = (query, request) => { - const data = { threadid: `R_MV_5_${query.mvid}`, composeliked: true }; - return request( - 'POST', - `https://music.163.com/api/comment/commentthread/info`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - mv_detail_info(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/mv/detail': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const mv_detail = (query, request) => { - const data = { id: query.mvid }; - return request('POST', `https://music.163.com/api/v1/mv/detail`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - mv_detail(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/mv/all': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const mv_all = (query, request) => { - const data = { - tags: JSON.stringify({ - 地区: query.area || '全部', - 类型: query.type || '全部', - 排序: query.order || '上升最快', - }), - offset: query.offset || 0, - total: 'true', - limit: query.limit || 30, - }; - return request( - 'POST', - `https://interface.music.163.com/api/mv/all`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - mv_all(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/msg/private/history': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const msg_private_history = (query, request) => { - const data = { - userId: query.uid, - limit: query.limit || 30, - time: query.before || 0, - total: 'true', - }; - return request( - 'POST', - `https://music.163.com/api/msg/private/history`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - msg_private_history(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/msg/private': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const msg_private = (query, request) => { - const data = { - offset: query.offset || 0, - limit: query.limit || 30, - total: 'true', - }; - return request( - 'POST', - `https://music.163.com/api/msg/private/users`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - msg_private(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/msg/notices': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const msg_notices = (query, request) => { - const data = { limit: query.limit || 30, time: query.lasttime || -1 }; - return request('POST', `https://music.163.com/api/msg/notices`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - msg_notices(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/msg/forwards': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const msg_forwards = (query, request) => { - const data = { - offset: query.offset || 0, - limit: query.limit || 30, - total: 'true', - }; - return request('POST', `https://music.163.com/api/forwards/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - msg_forwards(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/msg/comments': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const msg_comments = (query, request) => { - const data = { - beforeTime: query.before || '-1', - limit: query.limit || 30, - total: 'true', - uid: query.uid, - }; - return request( - 'POST', - `https://music.163.com/api/v1/user/comments/${query.uid}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - msg_comments(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/lyric': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const lyric = (query, request) => { - query.cookie.os = 'pc'; - const data = { id: query.id, lv: -1, kv: -1, tv: -1 }; - return request('POST', `https://music.163.com/api/song/lyric`, data, { - crypto: 'linuxapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - lyric(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/logout': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const logout = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/logout`, - {}, - { - crypto: 'weapi', - ua: 'pc', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - logout(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/login/status': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const login_status = (query, request) => { - return request( - 'GET', - `https://music.163.com`, - {}, - { cookie: query.cookie, proxy: query.proxy, realIP: query.realIP }, - ).then((response) => { - try { - let profile = eval( - `(${/GUser\\s*=\\s*([^;]+);/.exec(response.body)[1]})`, - ); - let bindings = eval( - `(${/GBinds\\s*=\\s*([^;]+);/.exec(response.body)[1]})`, - ); - response.body = { code: 200, profile: profile, bindings: bindings }; - return response; - } catch (err) { - response.status = 301; - response.body = { code: 301 }; - return Promise.reject(response); - } - }); - }; - login_status(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/login/refresh': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const login_refresh = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/login/token/refresh`, - {}, - { - crypto: 'weapi', - ua: 'pc', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - login_refresh(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/login/cellphone': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const login_cellphone = async (query, request) => { - query.cookie.os = 'pc'; - const data = { - phone: query.phone, - countrycode: query.countrycode || '86', - password: - query.md5_password || - crypto.createHash('md5').update(query.password).digest('hex'), - rememberLogin: 'true', - }; - let result = await request( - 'POST', - `https://music.163.com/weapi/login/cellphone`, - data, - { - crypto: 'weapi', - ua: 'pc', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - if (result.body.code === 200) { - result = { - status: 200, - body: { ...result.body, cookie: result.cookie.join(';') }, - cookie: result.cookie, - }; - } - return result; - }; - login_cellphone(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/login': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const login = async (query, request) => { - query.cookie.os = 'pc'; - const data = { - username: query.email, - password: - query.md5_password || - crypto.createHash('md5').update(query.password).digest('hex'), - rememberLogin: 'true', - }; - let result = await request( - 'POST', - `https://music.163.com/weapi/login`, - data, - { - crypto: 'weapi', - ua: 'pc', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - if (result.body.code === 502) { - return { - status: 200, - body: { msg: '账号或密码错误', code: 502, message: '账号或密码错误' }, - }; - } - if (result.body.code === 200) { - result = { - status: 200, - body: { ...result.body, cookie: result.cookie.join(';') }, - cookie: result.cookie, - }; - } - return result; - }; - login(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/likelist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const likelist = (query, request) => { - const data = { uid: query.uid }; - return request( - 'POST', - `https://music.163.com/weapi/song/like/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - likelist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/like': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const like = (query, request) => { - query.like = query.like == 'false' ? false : true; - const data = { trackId: query.id, like: query.like }; - return request( - 'POST', - `https://music.163.com/weapi/radio/like?alg=${ - query.alg || 'itembased' - }&trackId=${query.id}&time=${query.time || 25}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - like(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/hot/topic': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const hot_topic = (query, request) => { - const data = { limit: query.limit || 20, offset: query.offset || 0 }; - return request('POST', `https://music.163.com/weapi/act/hot`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - hot_topic(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/homepage/dragon/ball': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const homepage_dragon_ball = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/eapi/homepage/dragon/ball/static`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/homepage/dragon/ball/static', - realIP: query.realIP, - }, - ); - }; - homepage_dragon_ball(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/homepage/block/page': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const homepage_block_page = (query, request) => { - const data = { refresh: query.refresh || true }; - return request( - 'POST', - `https://music.163.com/api/homepage/block/page`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - homepage_block_page(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/history/recommend/songs/detail': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const history_recommend_songs_detail = (query, request) => { - query.cookie.os = 'ios'; - const data = { date: query.date || '' }; - return request( - 'POST', - `https://music.163.com/api/discovery/recommend/songs/history/detail`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - history_recommend_songs_detail(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/history/recommend/songs': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const history_recommend_songs = (query, request) => { - query.cookie.os = 'ios'; - const data = {}; - return request( - 'POST', - `https://music.163.com/api/discovery/recommend/songs/history/recent`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - history_recommend_songs(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/follow': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const follow = (query, request) => { - query.cookie.os = 'pc'; - query.t = query.t == 1 ? 'follow' : 'delfollow'; - return request( - 'POST', - `https://music.163.com/weapi/user/${query.t}/${query.id}`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - follow(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/fm_trash': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const fm_trash = (query, request) => { - const data = { songId: query.id }; - return request( - 'POST', - `https://music.163.com/weapi/radio/trash/add?alg=RT&songId=${ - query.id - }&time=${query.time || 25}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - fm_trash(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/event/forward': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const event_forward = (query, request) => { - query.cookie.os = 'pc'; - const data = { - forwards: query.forwards, - id: query.evId, - eventUserId: query.uid, - }; - return request( - 'POST', - `https://music.163.com/weapi/event/forward`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - event_forward(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/event/del': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const event_del = (query, request) => { - const data = { id: query.evId }; - return request('POST', `https://music.163.com/eapi/event/delete`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - event_del(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/event': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const event = (query, request) => { - const data = { - pagesize: query.pagesize || 20, - lasttime: query.lasttime || -1, - }; - return request('POST', `https://music.163.com/weapi/v1/event/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - event(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/toplist/popular': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_toplist_popular = (query, request) => { - const data = { limit: query.limit || 100 }; - return request( - 'POST', - `https://music.163.com/api/dj/toplist/popular`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_toplist_popular(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/toplist/pay': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_toplist_pay = (query, request) => { - const data = { limit: query.limit || 100 }; - return request( - 'POST', - `https://music.163.com/api/djradio/toplist/pay`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_toplist_pay(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/toplist/newcomer': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_toplist_newcomer = (query, request) => { - const data = { limit: query.limit || 100, offset: query.offset || 0 }; - return request( - 'POST', - `https://music.163.com/api/dj/toplist/newcomer`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_toplist_newcomer(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/toplist/hours': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_toplist_hours = (query, request) => { - const data = { limit: query.limit || 100 }; - return request( - 'POST', - `https://music.163.com/api/dj/toplist/hours`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_toplist_hours(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/toplist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_toplist = (query, request) => { - const data = { - limit: query.limit || 100, - offset: query.offset || 0, - type: typeMap[query.type || 'new'] || '0', - }; - return request( - 'POST', - `https://music.163.com/api/djradio/toplist`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_toplist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/today/perfered': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_today_perfered = (query, request) => { - const data = { page: query.page || 0 }; - return request( - 'POST', - `https://music.163.com/weapi/djradio/home/today/perfered`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_today_perfered(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/subscriber': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_subscriber = (query, request) => { - const data = { - time: query.time || '-1', - id: query.id, - limit: query.limit || '20', - total: 'true', - }; - return request( - 'POST', - `https://music.163.com/api/djradio/subscriber`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_subscriber(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/sublist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_sublist = (query, request) => { - const data = { - limit: query.limit || 30, - offset: query.offset || 0, - total: true, - }; - return request( - 'POST', - `https://music.163.com/weapi/djradio/get/subed`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_sublist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/sub': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_sub = (query, request) => { - query.t = query.t == 1 ? 'sub' : 'unsub'; - const data = { id: query.rid }; - return request( - 'POST', - `https://music.163.com/weapi/djradio/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_sub(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/recommend/type': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_recommend_type = (query, request) => { - const data = { cateId: query.type }; - return request( - 'POST', - `https://music.163.com/weapi/djradio/recommend`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_recommend_type(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/recommend': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_recommend = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/djradio/recommend/v1`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_recommend(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/radio/hot': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_radio_hot = (query, request) => { - const data = { - cateId: query.cateId, - limit: query.limit || 30, - offset: query.offset || 0, - }; - return request('POST', `https://music.163.com/api/djradio/hot`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - dj_radio_hot(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/program/toplist/hours': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_program_toplist_hours = (query, request) => { - const data = { limit: query.limit || 100 }; - return request( - 'POST', - `https://music.163.com/api/djprogram/toplist/hours`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_program_toplist_hours(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/program/toplist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_program_toplist = (query, request) => { - const data = { limit: query.limit || 100, offset: query.offset || 0 }; - return request( - 'POST', - `https://music.163.com/api/program/toplist/v1`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_program_toplist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/program/detail': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_program_detail = (query, request) => { - const data = { id: query.id }; - return request( - 'POST', - `https://music.163.com/api/dj/program/detail`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_program_detail(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/program': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_program = (query, request) => { - const data = { - radioId: query.rid, - limit: query.limit || 30, - offset: query.offset || 0, - asc: toBoolean(query.asc), - }; - return request( - 'POST', - `https://music.163.com/weapi/dj/program/byradio`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_program(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/personalize/recommend': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_personalize_recommend = (query, request) => { - return request( - 'POST', - `https://music.163.com/api/djradio/personalize/rcmd`, - { limit: query.limit || 6 }, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_personalize_recommend(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/paygift': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_paygift = (query, request) => { - const data = { limit: query.limit || 30, offset: query.offset || 0 }; - return request( - 'POST', - `https://music.163.com/weapi/djradio/home/paygift/list?_nmclfl=1`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_paygift(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/hot': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_hot = (query, request) => { - const data = { limit: query.limit || 30, offset: query.offset || 0 }; - return request( - 'POST', - `https://music.163.com/weapi/djradio/hot/v1`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_hot(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/detail': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_detail = (query, request) => { - const data = { id: query.rid }; - return request('POST', `https://music.163.com/api/djradio/v2/get`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - dj_detail(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/catelist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_catelist = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/djradio/category/get`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_catelist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/category/recommend': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_category_recommend = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/djradio/home/category/recommend`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_category_recommend(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/category/excludehot': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_category_excludehot = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/djradio/category/excludehot`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_category_excludehot(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/dj/banner': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const dj_banner = (query, request) => { - const data = {}; - query.cookie.os = 'pc'; - return request( - 'POST', - `https://music.163.com/weapi/djradio/banner/get`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - dj_banner(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/digitalAlbum/purchased': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const digitalAlbum_purchased = (query, request) => { - const data = { - limit: query.limit || 30, - offset: query.offset || 0, - total: true, - }; - return request( - 'POST', - `https://music.163.com/api/digitalAlbum/purchased`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - digitalAlbum_purchased(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/digitalAlbum/ordering': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const digitalAlbum_ordering = (query, request) => { - const data = { - business: 'Album', - paymentMethod: query.payment, - digitalResources: JSON.stringify([ - { business: 'Album', resourceID: query.id, quantity: query.quantity }, - ]), - from: 'web', - }; - return request( - 'POST', - `https://music.163.com/api/ordering/web/digital`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - digitalAlbum_ordering(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/daily_signin': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const daily_signin = (query, request) => { - const data = { type: query.type || 0 }; - return request( - 'POST', - `https://music.163.com/weapi/point/dailyTask`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - daily_signin(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/countries/code/list': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const countries_code_list = (query, request) => { - const data = {}; - return request( - 'POST', - `https://interface3.music.163.com/eapi/lbs/countries/v1`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/lbs/countries/v1', - realIP: query.realIP, - }, - ); - }; - countries_code_list(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/comment/video': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const comment_video = (query, request) => { - query.cookie.os = 'pc'; - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/R_VI_62_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - comment_video(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/comment/playlist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const comment_playlist = (query, request) => { - query.cookie.os = 'pc'; - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/A_PL_0_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - comment_playlist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/comment/new': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const comment_new = (query, request) => { - query.cookie.os = 'pc'; - query.type = { - 0: 'R_SO_4_', - 1: 'R_MV_5_', - 2: 'A_PL_0_', - 3: 'R_AL_3_', - 4: 'A_DJ_1_', - 5: 'R_VI_62_', - 6: 'A_EV_2_', - }[query.type]; - const threadId = query.type + query.id; - const pageSize = query.pageSize || 20; - const pageNo = query.pageNo || 1; - const data = { - threadId: threadId, - pageNo, - showInner: query.showInner || true, - pageSize, - cursor: - +query.sortType === 3 ? query.cursor || '0' : (pageNo - 1) * pageSize, - sortType: query.sortType || 1, - }; - return request( - 'POST', - `https://music.163.com/api/v2/resource/comments`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - url: '/api/v2/resource/comments', - }, - ); - }; - comment_new(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/comment/mv': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const comment_mv = (query, request) => { - query.cookie.os = 'pc'; - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/R_MV_5_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - comment_mv(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/comment/music': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const comment_music = (query, request) => { - query.cookie.os = 'pc'; - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/api/v1/resource/comments/R_SO_4_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - comment_music(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/comment/like': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const comment_like = (query, request) => { - query.cookie.os = 'pc'; - query.t = query.t == 1 ? 'like' : 'unlike'; - query.type = { - 0: 'R_SO_4_', - 1: 'R_MV_5_', - 2: 'A_PL_0_', - 3: 'R_AL_3_', - 4: 'A_DJ_1_', - 5: 'R_VI_62_', - 6: 'A_EV_2_', - }[query.type]; - const data = { threadId: query.type + query.id, commentId: query.cid }; - if (query.type == 'A_EV_2_') { - data.threadId = query.threadId; - } - return request( - 'POST', - `https://music.163.com/weapi/v1/comment/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - comment_like(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/comment/hotwall/list': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const comment_hotwall_list = (query, request) => { - const data = {}; - return request( - 'POST', - `https://music.163.com/api/comment/hotwall/list/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - comment_hotwall_list(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/comment/hot': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const comment_hot = (query, request) => { - query.cookie.os = 'pc'; - query.type = { - 0: 'R_SO_4_', - 1: 'R_MV_5_', - 2: 'A_PL_0_', - 3: 'R_AL_3_', - 4: 'A_DJ_1_', - 5: 'R_VI_62_', - }[query.type]; - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/hotcomments/${query.type}${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - comment_hot(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/comment/floor': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const comment_floor = (query, request) => { - query.type = { - 0: 'R_SO_4_', - 1: 'R_MV_5_', - 2: 'A_PL_0_', - 3: 'R_AL_3_', - 4: 'A_DJ_1_', - 5: 'R_VI_62_', - }[query.type]; - const data = { - parentCommentId: query.parentCommentId, - threadId: query.type + query.id, - time: query.time || -1, - limit: query.limit || 20, - }; - return request( - 'POST', - `https://music.163.com/api/resource/comment/floor/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - comment_floor(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/comment/event': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const comment_event = (query, request) => { - const data = { - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/${query.threadId}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - comment_event(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/comment/dj': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const comment_dj = (query, request) => { - query.cookie.os = 'pc'; - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/A_DJ_1_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - comment_dj(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/comment/album': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const comment_album = (query, request) => { - query.cookie.os = 'pc'; - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/R_AL_3_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - comment_album(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/comment': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const comment = (query, request) => { - query.cookie.os = 'pc'; - query.t = { 1: 'add', 0: 'delete', 2: 'reply' }[query.t]; - query.type = { - 0: 'R_SO_4_', - 1: 'R_MV_5_', - 2: 'A_PL_0_', - 3: 'R_AL_3_', - 4: 'A_DJ_1_', - 5: 'R_VI_62_', - 6: 'A_EV_2_', - }[query.type]; - const data = { threadId: query.type + query.id }; - if (query.type == 'A_EV_2_') { - data.threadId = query.threadId; - } - if (query.t == 'add') data.content = query.content; - else if (query.t == 'delete') data.commentId = query.commentId; - else if (query.t == 'reply') { - data.commentId = query.commentId; - data.content = query.content; - } - return request( - 'POST', - `https://music.163.com/weapi/resource/comments/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - comment(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/cloudsearch': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const cloudsearch = (query, request) => { - const data = { - s: query.keywords, - type: query.type || 1, - limit: query.limit || 30, - offset: query.offset || 0, - }; - return request( - 'POST', - `https://music.163.com/weapi/cloudsearch/get/web`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - cloudsearch(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/check/music': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const check_music = (query, request) => { - const data = { - ids: '[' + parseInt(query.id) + ']', - br: parseInt(query.br || 999000), - }; - return request( - 'POST', - `https://music.163.com/weapi/song/enhance/player/url`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ).then((response) => { - let playable = false; - if (response.body.code == 200) { - if (response.body.data[0].code == 200) { - playable = true; - } - } - if (playable) { - response.body = { success: true, message: 'ok' }; - return response; - } else { - response.status = 404; - response.body = { success: false, message: '亲爱的,暂无版权' }; - return Promise.reject(response); - } - }); - }; - check_music(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/cellphone/existence/check': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const cellphone_existence_check = (query, request) => { - const data = { cellphone: query.phone, countrycode: query.countrycode }; - return request( - 'POST', - `https://music.163.com/eapi/cellphone/existence/check`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - url: '/api/cellphone/existence/check', - realIP: query.realIP, - }, - ); - }; - cellphone_existence_check(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/captcha/verify': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const captcha_verify = (query, request) => { - const data = { - ctcode: query.ctcode || '86', - cellphone: query.phone, - captcha: query.captcha, - }; - return request( - 'POST', - `https://music.163.com/weapi/sms/captcha/verify`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - captcha_verify(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/captcha/sent': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const captcha_sent = (query, request) => { - const data = { ctcode: query.ctcode || '86', cellphone: query.phone }; - return request( - 'POST', - `https://music.163.com/weapi/sms/captcha/sent`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - captcha_sent(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/calendar': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const calendar = (query, request) => { - const data = { - startTime: query.startTime || Date.now(), - endTime: query.endTime || Date.now(), - }; - return request( - 'POST', - `https://music.163.com/api/mcalendar/detail`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - calendar(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/banner': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const banner = (query, request) => { - const type = - { 0: 'pc', 1: 'android', 2: 'iphone', 3: 'ipad' }[query.type || 0] || - 'pc'; - return request( - 'POST', - `https://music.163.com/api/v2/banner/get`, - { clientType: type }, - { crypto: 'linuxapi', proxy: query.proxy, realIP: query.realIP }, - ); - }; - banner(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/avatar/upload': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const avatar_upload = async (query, request) => { - const uploadInfo = await uploadPlugin(query, request); - const res = await request( - 'POST', - `https://music.163.com/weapi/user/avatar/upload/v1`, - { imgid: uploadInfo.imgId }, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - return { - status: 200, - body: { code: 200, data: { ...uploadInfo, ...res.body } }, - }; - }; - avatar_upload(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/audio/match': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const audio_match = (query, request) => { - query.cookie.os = 'pc'; - const data = { - algorithmCode: 'shazam_v2', - times: 1, - sessionId: 'C999431ACDC84EDBB984763654E6F8D7', - duration: 3.3066249999999995, - from: 'recognize-song', - rawdata: realData, - }; - return request( - 'POST', - `https://music.163.com/api/music/audio/match`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - audio_match(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/artists': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const artists = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/v1/artist/${query.id}`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - artists(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/artist/top/song': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const artist_top_song = (query, request) => { - const data = { id: query.id }; - return request( - 'POST', - `https://music.163.com/api/artist/top/song`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - artist_top_song(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/artist/sublist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const artist_sublist = (query, request) => { - const data = { - limit: query.limit || 25, - offset: query.offset || 0, - total: true, - }; - return request( - 'POST', - `https://music.163.com/weapi/artist/sublist`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - artist_sublist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/artist/sub': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const artist_sub = (query, request) => { - query.t = query.t == 1 ? 'sub' : 'unsub'; - const data = { artistId: query.id, artistIds: '[' + query.id + ']' }; - return request( - 'POST', - `https://music.163.com/weapi/artist/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - artist_sub(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/artist/songs': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const artist_songs = (query, request) => { - query.cookie.os = 'pc'; - const data = { - id: query.id, - private_cloud: 'true', - work_type: 1, - order: query.order || 'hot', - offset: query.offset || 0, - limit: query.limit || 100, - }; - return request( - 'POST', - `https://music.163.com/api/v1/artist/songs`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - artist_songs(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/artist/mv': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const artist_mv = (query, request) => { - const data = { - artistId: query.id, - limit: query.limit, - offset: query.offset, - total: true, - }; - return request('POST', `https://music.163.com/weapi/artist/mvs`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - artist_mv(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/artist/list': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const artist_list = (query, request) => { - const data = { - initial: isNaN(query.initial) - ? (query.initial || '').toUpperCase().charCodeAt() || undefined - : query.initial, - offset: query.offset || 0, - limit: query.limit || 30, - total: true, - type: query.type || '1', - area: query.area, - }; - return request('POST', `https://music.163.com/api/v1/artist/list`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - artist_list(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/artist/desc': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const artist_desc = (query, request) => { - const data = { id: query.id }; - return request( - 'POST', - `https://music.163.com/weapi/artist/introduction`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - artist_desc(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/artist/album': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const artist_album = (query, request) => { - const data = { - limit: query.limit || 30, - offset: query.offset || 0, - total: true, - }; - return request( - 'POST', - `https://music.163.com/weapi/artist/albums/${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - artist_album(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/album/sublist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const album_sublist = (query, request) => { - const data = { - limit: query.limit || 25, - offset: query.offset || 0, - total: true, - }; - return request( - 'POST', - `https://music.163.com/weapi/album/sublist`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - album_sublist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/album/sub': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const album_sub = (query, request) => { - query.t = query.t == 1 ? 'sub' : 'unsub'; - const data = { id: query.id }; - return request( - 'POST', - `https://music.163.com/api/album/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - album_sub(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/album/songsaleboard': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const album_songsaleboard = (query, request) => { - let data = { albumType: query.albumType || 0 }; - const type = query.type || 'daily'; - if (type === 'year') { - data = { ...data, year: query.year }; - } - return request( - 'POST', - `https://music.163.com/api/feealbum/songsaleboard/${type}/type`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - album_songsaleboard(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/album/newest': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const album_newest = (query, request) => { - return request( - 'POST', - `https://music.163.com/api/discovery/newAlbum`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - album_newest(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/album/new': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const album_new = (query, request) => { - const data = { - limit: query.limit || 30, - offset: query.offset || 0, - total: true, - area: query.area || 'ALL', - }; - return request('POST', `https://music.163.com/weapi/album/new`, data, { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }); - }; - album_new(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/album/list/style': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const album_list_style = (query, request) => { - const data = { - limit: query.limit || 10, - offset: query.offset || 0, - total: true, - area: query.area || 'Z_H', - }; - return request( - 'POST', - `https://music.163.com/weapi/vipmall/appalbum/album/style`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - album_list_style(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/album/list': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const album_list = (query, request) => { - const data = { - limit: query.limit || 30, - offset: query.offset || 0, - total: true, - area: query.area || 'ALL', - type: query.type, - }; - return request( - 'POST', - `https://music.163.com/weapi/vipmall/albumproduct/list`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - album_list(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/album/detail/dynamic': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const album_detail_dynamic = (query, request) => { - const data = { id: query.id }; - return request( - 'POST', - `https://music.163.com/api/album/detail/dynamic`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - album_detail_dynamic(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/album/detail': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const album_detail = (query, request) => { - const data = { id: query.id }; - return request( - 'POST', - `https://music.163.com/weapi/vipmall/albumproduct/detail`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - album_detail(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/album': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const album = (query, request) => { - return request( - 'POST', - `https://music.163.com/weapi/v1/album/${query.id}`, - {}, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ); - }; - album(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/activate/init/profile': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const activate_init_profile = (query, request) => { - const data = { nickname: query.nickname }; - return request( - 'POST', - `https://music.163.com/eapi/activate/initProfile`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - url: '/api/activate/initProfile', - }, - ); - }; - activate_init_profile(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - '/related/playlist': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const related_playlist = (query, request) => { - return request( - 'GET', - `https://music.163.com/playlist?id=${query.id}`, - {}, - { - ua: 'pc', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ).then((response) => { - try { - const pattern = /
[\s\S]*?[\s\S]*?]*>([^<]+?)<\/a>[\s\S]*?]*>([^<]+?)<\/a>/g; - let result, - playlists = []; - while ((result = pattern.exec(response.body)) != null) { - playlists.push({ - creator: { - userId: result[4].slice('/user/home?id='.length), - nickname: result[5], - }, - coverImgUrl: result[1].slice(0, -'?param=50y50'.length), - name: result[3], - id: result[2].slice('/playlist?id='.length), - }); - } - response.body = { code: 200, playlists: playlists }; - return response; - } catch (err) { - response.status = 500; - response.body = { code: 500, msg: err.stack }; - return Promise.reject(response); - } - }); - }; - related_playlist(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, - - '/batch': (req, res) => { - if (typeof req.query.cookie === 'string') { - req.query.cookie = cookieToJson(req.query.cookie); - } - let query = Object.assign( - {}, - { cookie: req.cookies }, - req.query, - req.body, - req.files, - ); - const batch = (query, request) => { - const data = { - e_r: true, - }; - Object.keys(query).forEach((i) => { - if (/^\/api\//.test(i)) { - data[i] = query[i]; - } - }); - return request('POST', `https://music.163.com/eapi/batch`, data, { - crypto: 'eapi', - proxy: query.proxy, - url: '/api/batch', - cookie: query.cookie, - realIP: query.realIP, - }); - }; - batch(query, request) - .then((answer) => { - console.log('[OK]', decodeURIComponent(req.originalUrl)); - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }) - .catch((answer) => { - console.log('[ERR]', decodeURIComponent(req.originalUrl), { - status: answer.status, - body: answer.body, - }); - if (answer.body.code == '301') answer.body.msg = '需要登录'; - res.append('Set-Cookie', answer.cookie); - res.status(answer.status).send(answer.body); - }); - }, -}; diff --git a/netease_api/tsconfig.json b/netease_api/tsconfig.json deleted file mode 100644 index 248536d..0000000 --- a/netease_api/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2015", - "module": "commonjs", - "experimentalDecorators": true, - "moduleResolution": "node", - "lib": ["esnext", "esnext.asynciterable", "dom"], - "esModuleInterop": true, - "allowJs": true, - "sourceMap": true, - "strict": true, - "noEmit": true, - "baseUrl": ".", - "paths": { - "~/*": ["./*"], - "@/*": ["./*"] - } - }, - "exclude": ["node_modules"] -} diff --git a/netease_api/util/apicache.js b/netease_api/util/apicache.js deleted file mode 100644 index 1b267ed..0000000 --- a/netease_api/util/apicache.js +++ /dev/null @@ -1,830 +0,0 @@ -var url = require('url'); -var MemoryCache = require('./memory-cache'); - -var t = { - ms: 1, - second: 1000, - minute: 60000, - hour: 3600000, - day: 3600000 * 24, - week: 3600000 * 24 * 7, - month: 3600000 * 24 * 30, -}; - -var instances = []; - -var matches = function (a) { - return function (b) { - return a === b; - }; -}; - -var doesntMatch = function (a) { - return function (b) { - return !matches(a)(b); - }; -}; - -var logDuration = function (d, prefix) { - var str = d > 1000 ? (d / 1000).toFixed(2) + 'sec' : d + 'ms'; - return '\x1b[33m- ' + (prefix ? prefix + ' ' : '') + str + '\x1b[0m'; -}; - -function getSafeHeaders(res) { - return res.getHeaders ? res.getHeaders() : res._headers; -} - -function ApiCache() { - var memCache = new MemoryCache(); - - var globalOptions = { - debug: false, - defaultDuration: 3600000, - enabled: true, - appendKey: [], - jsonp: false, - redisClient: false, - headerBlacklist: [], - statusCodes: { - include: [], - exclude: [], - }, - events: { - expire: undefined, - }, - headers: { - // 'cache-control': 'no-cache' // example of header overwrite - }, - trackPerformance: false, - }; - - var middlewareOptions = []; - var instance = this; - var index = null; - var timers = {}; - var performanceArray = []; // for tracking cache hit rate - - instances.push(this); - this.id = instances.length; - - function debug(a, b, c, d) { - var arr = ['\x1b[36m[apicache]\x1b[0m', a, b, c, d].filter(function (arg) { - return arg !== undefined; - }); - var debugEnv = - process.env.DEBUG && - process.env.DEBUG.split(',').indexOf('apicache') !== -1; - - return (globalOptions.debug || debugEnv) && console.log.apply(null, arr); - } - - function shouldCacheResponse(request, response, toggle) { - var opt = globalOptions; - var codes = opt.statusCodes; - - if (!response) return false; - - if (toggle && !toggle(request, response)) { - return false; - } - - if ( - codes.exclude && - codes.exclude.length && - codes.exclude.indexOf(response.statusCode) !== -1 - ) - return false; - if ( - codes.include && - codes.include.length && - codes.include.indexOf(response.statusCode) === -1 - ) - return false; - - return true; - } - - function addIndexEntries(key, req) { - var groupName = req.apicacheGroup; - - if (groupName) { - debug('group detected "' + groupName + '"'); - var group = (index.groups[groupName] = index.groups[groupName] || []); - group.unshift(key); - } - - index.all.unshift(key); - } - - function filterBlacklistedHeaders(headers) { - return Object.keys(headers) - .filter(function (key) { - return globalOptions.headerBlacklist.indexOf(key) === -1; - }) - .reduce(function (acc, header) { - acc[header] = headers[header]; - return acc; - }, {}); - } - - function createCacheObject(status, headers, data, encoding) { - return { - status: status, - headers: filterBlacklistedHeaders(headers), - data: data, - encoding: encoding, - timestamp: new Date().getTime() / 1000, // seconds since epoch. This is used to properly decrement max-age headers in cached responses. - }; - } - - function cacheResponse(key, value, duration) { - var redis = globalOptions.redisClient; - var expireCallback = globalOptions.events.expire; - - if (redis && redis.connected) { - try { - redis.hset(key, 'response', JSON.stringify(value)); - redis.hset(key, 'duration', duration); - redis.expire(key, duration / 1000, expireCallback || function () {}); - } catch (err) { - debug('[apicache] error in redis.hset()'); - } - } else { - memCache.add(key, value, duration, expireCallback); - } - - // add automatic cache clearing from duration, includes max limit on setTimeout - timers[key] = setTimeout(function () { - instance.clear(key, true); - }, Math.min(duration, 2147483647)); - } - - function accumulateContent(res, content) { - if (content) { - if (typeof content == 'string') { - res._apicache.content = (res._apicache.content || '') + content; - } else if (Buffer.isBuffer(content)) { - var oldContent = res._apicache.content; - - if (typeof oldContent === 'string') { - oldContent = !Buffer.from - ? new Buffer(oldContent) - : Buffer.from(oldContent); - } - - if (!oldContent) { - oldContent = !Buffer.alloc ? new Buffer(0) : Buffer.alloc(0); - } - - res._apicache.content = Buffer.concat( - [oldContent, content], - oldContent.length + content.length, - ); - } else { - res._apicache.content = content; - } - } - } - - function makeResponseCacheable( - req, - res, - next, - key, - duration, - strDuration, - toggle, - ) { - // monkeypatch res.end to create cache object - res._apicache = { - write: res.write, - writeHead: res.writeHead, - end: res.end, - cacheable: true, - content: undefined, - }; - - // append header overwrites if applicable - Object.keys(globalOptions.headers).forEach(function (name) { - res.setHeader(name, globalOptions.headers[name]); - }); - - res.writeHead = function () { - // add cache control headers - if (!globalOptions.headers['cache-control']) { - if (shouldCacheResponse(req, res, toggle)) { - res.setHeader( - 'cache-control', - 'max-age=' + (duration / 1000).toFixed(0), - ); - } else { - res.setHeader('cache-control', 'no-cache, no-store, must-revalidate'); - } - } - - res._apicache.headers = Object.assign({}, getSafeHeaders(res)); - return res._apicache.writeHead.apply(this, arguments); - }; - - // patch res.write - res.write = function (content) { - accumulateContent(res, content); - return res._apicache.write.apply(this, arguments); - }; - - // patch res.end - res.end = function (content, encoding) { - if (shouldCacheResponse(req, res, toggle)) { - accumulateContent(res, content); - - if (res._apicache.cacheable && res._apicache.content) { - addIndexEntries(key, req); - var headers = res._apicache.headers || getSafeHeaders(res); - var cacheObject = createCacheObject( - res.statusCode, - headers, - res._apicache.content, - encoding, - ); - cacheResponse(key, cacheObject, duration); - - // display log entry - var elapsed = new Date() - req.apicacheTimer; - debug( - 'adding cache entry for "' + key + '" @ ' + strDuration, - logDuration(elapsed), - ); - debug('_apicache.headers: ', res._apicache.headers); - debug('res.getHeaders(): ', getSafeHeaders(res)); - debug('cacheObject: ', cacheObject); - } - } - - return res._apicache.end.apply(this, arguments); - }; - - next(); - } - - function sendCachedResponse( - request, - response, - cacheObject, - toggle, - next, - duration, - ) { - if (toggle && !toggle(request, response)) { - return next(); - } - - var headers = getSafeHeaders(response); - - Object.assign( - headers, - filterBlacklistedHeaders(cacheObject.headers || {}), - { - // set properly-decremented max-age header. This ensures that max-age is in sync with the cache expiration. - 'cache-control': - 'max-age=' + - Math.max( - 0, - ( - duration / 1000 - - (new Date().getTime() / 1000 - cacheObject.timestamp) - ).toFixed(0), - ), - }, - ); - - // only embed apicache headers when not in production environment - - // unstringify buffers - var data = cacheObject.data; - if (data && data.type === 'Buffer') { - data = - typeof data.data === 'number' - ? new Buffer.alloc(data.data) - : new Buffer.from(data.data); - } - - // test Etag against If-None-Match for 304 - var cachedEtag = cacheObject.headers.etag; - var requestEtag = request.headers['if-none-match']; - - if (requestEtag && cachedEtag === requestEtag) { - response.writeHead(304, headers); - return response.end(); - } - - response.writeHead(cacheObject.status || 200, headers); - - return response.end(data, cacheObject.encoding); - } - - function syncOptions() { - for (var i in middlewareOptions) { - Object.assign( - middlewareOptions[i].options, - globalOptions, - middlewareOptions[i].localOptions, - ); - } - } - - this.clear = function (target, isAutomatic) { - var group = index.groups[target]; - var redis = globalOptions.redisClient; - - if (group) { - debug('clearing group "' + target + '"'); - - group.forEach(function (key) { - debug('clearing cached entry for "' + key + '"'); - clearTimeout(timers[key]); - delete timers[key]; - if (!globalOptions.redisClient) { - memCache.delete(key); - } else { - try { - redis.del(key); - } catch (err) { - console.log('[apicache] error in redis.del("' + key + '")'); - } - } - index.all = index.all.filter(doesntMatch(key)); - }); - - delete index.groups[target]; - } else if (target) { - debug( - 'clearing ' + - (isAutomatic ? 'expired' : 'cached') + - ' entry for "' + - target + - '"', - ); - clearTimeout(timers[target]); - delete timers[target]; - // clear actual cached entry - if (!redis) { - memCache.delete(target); - } else { - try { - redis.del(target); - } catch (err) { - console.log('[apicache] error in redis.del("' + target + '")'); - } - } - - // remove from global index - index.all = index.all.filter(doesntMatch(target)); - - // remove target from each group that it may exist in - Object.keys(index.groups).forEach(function (groupName) { - index.groups[groupName] = index.groups[groupName].filter( - doesntMatch(target), - ); - - // delete group if now empty - if (!index.groups[groupName].length) { - delete index.groups[groupName]; - } - }); - } else { - debug('clearing entire index'); - - if (!redis) { - memCache.clear(); - } else { - // clear redis keys one by one from internal index to prevent clearing non-apicache entries - index.all.forEach(function (key) { - clearTimeout(timers[key]); - delete timers[key]; - try { - redis.del(key); - } catch (err) { - console.log('[apicache] error in redis.del("' + key + '")'); - } - }); - } - this.resetIndex(); - } - - return this.getIndex(); - }; - - function parseDuration(duration, defaultDuration) { - if (typeof duration === 'number') return duration; - - if (typeof duration === 'string') { - var split = duration.match(/^([\d\.,]+)\s?(\w+)$/); - - if (split.length === 3) { - var len = parseFloat(split[1]); - var unit = split[2].replace(/s$/i, '').toLowerCase(); - if (unit === 'm') { - unit = 'ms'; - } - - return (len || 1) * (t[unit] || 0); - } - } - - return defaultDuration; - } - - this.getDuration = function (duration) { - return parseDuration(duration, globalOptions.defaultDuration); - }; - - /** - * Return cache performance statistics (hit rate). Suitable for putting into a route: - * - * app.get('/api/cache/performance', (req, res) => { - * res.json(apicache.getPerformance()) - * }) - * - */ - this.getPerformance = function () { - return performanceArray.map(function (p) { - return p.report(); - }); - }; - - this.getIndex = function (group) { - if (group) { - return index.groups[group]; - } else { - return index; - } - }; - - this.middleware = function cache( - strDuration, - middlewareToggle, - localOptions, - ) { - var duration = instance.getDuration(strDuration); - var opt = {}; - - middlewareOptions.push({ - options: opt, - }); - - var options = function (localOptions) { - if (localOptions) { - middlewareOptions.find(function (middleware) { - return middleware.options === opt; - }).localOptions = localOptions; - } - - syncOptions(); - - return opt; - }; - - options(localOptions); - - /** - * A Function for non tracking performance - */ - function NOOPCachePerformance() { - this.report = this.hit = this.miss = function () {}; // noop; - } - - /** - * A function for tracking and reporting hit rate. These statistics are returned by the getPerformance() call above. - */ - function CachePerformance() { - /** - * Tracks the hit rate for the last 100 requests. - * If there have been fewer than 100 requests, the hit rate just considers the requests that have happened. - */ - this.hitsLast100 = new Uint8Array(100 / 4); // each hit is 2 bits - - /** - * Tracks the hit rate for the last 1000 requests. - * If there have been fewer than 1000 requests, the hit rate just considers the requests that have happened. - */ - this.hitsLast1000 = new Uint8Array(1000 / 4); // each hit is 2 bits - - /** - * Tracks the hit rate for the last 10000 requests. - * If there have been fewer than 10000 requests, the hit rate just considers the requests that have happened. - */ - this.hitsLast10000 = new Uint8Array(10000 / 4); // each hit is 2 bits - - /** - * Tracks the hit rate for the last 100000 requests. - * If there have been fewer than 100000 requests, the hit rate just considers the requests that have happened. - */ - this.hitsLast100000 = new Uint8Array(100000 / 4); // each hit is 2 bits - - /** - * The number of calls that have passed through the middleware since the server started. - */ - this.callCount = 0; - - /** - * The total number of hits since the server started - */ - this.hitCount = 0; - - /** - * The key from the last cache hit. This is useful in identifying which route these statistics apply to. - */ - this.lastCacheHit = null; - - /** - * The key from the last cache miss. This is useful in identifying which route these statistics apply to. - */ - this.lastCacheMiss = null; - - /** - * Return performance statistics - */ - this.report = function () { - return { - lastCacheHit: this.lastCacheHit, - lastCacheMiss: this.lastCacheMiss, - callCount: this.callCount, - hitCount: this.hitCount, - missCount: this.callCount - this.hitCount, - hitRate: this.callCount == 0 ? null : this.hitCount / this.callCount, - hitRateLast100: this.hitRate(this.hitsLast100), - hitRateLast1000: this.hitRate(this.hitsLast1000), - hitRateLast10000: this.hitRate(this.hitsLast10000), - hitRateLast100000: this.hitRate(this.hitsLast100000), - }; - }; - - /** - * Computes a cache hit rate from an array of hits and misses. - * @param {Uint8Array} array An array representing hits and misses. - * @returns a number between 0 and 1, or null if the array has no hits or misses - */ - this.hitRate = function (array) { - var hits = 0; - var misses = 0; - for (var i = 0; i < array.length; i++) { - var n8 = array[i]; - for (j = 0; j < 4; j++) { - switch (n8 & 3) { - case 1: - hits++; - break; - case 2: - misses++; - break; - } - n8 >>= 2; - } - } - var total = hits + misses; - if (total == 0) return null; - return hits / total; - }; - - /** - * Record a hit or miss in the given array. It will be recorded at a position determined - * by the current value of the callCount variable. - * @param {Uint8Array} array An array representing hits and misses. - * @param {boolean} hit true for a hit, false for a miss - * Each element in the array is 8 bits, and encodes 4 hit/miss records. - * Each hit or miss is encoded as to bits as follows: - * 00 means no hit or miss has been recorded in these bits - * 01 encodes a hit - * 10 encodes a miss - */ - this.recordHitInArray = function (array, hit) { - var arrayIndex = ~~(this.callCount / 4) % array.length; - var bitOffset = (this.callCount % 4) * 2; // 2 bits per record, 4 records per uint8 array element - var clearMask = ~(3 << bitOffset); - var record = (hit ? 1 : 2) << bitOffset; - array[arrayIndex] = (array[arrayIndex] & clearMask) | record; - }; - - /** - * Records the hit or miss in the tracking arrays and increments the call count. - * @param {boolean} hit true records a hit, false records a miss - */ - this.recordHit = function (hit) { - this.recordHitInArray(this.hitsLast100, hit); - this.recordHitInArray(this.hitsLast1000, hit); - this.recordHitInArray(this.hitsLast10000, hit); - this.recordHitInArray(this.hitsLast100000, hit); - if (hit) this.hitCount++; - this.callCount++; - }; - - /** - * Records a hit event, setting lastCacheMiss to the given key - * @param {string} key The key that had the cache hit - */ - this.hit = function (key) { - this.recordHit(true); - this.lastCacheHit = key; - }; - - /** - * Records a miss event, setting lastCacheMiss to the given key - * @param {string} key The key that had the cache miss - */ - this.miss = function (key) { - this.recordHit(false); - this.lastCacheMiss = key; - }; - } - - var perf = globalOptions.trackPerformance - ? new CachePerformance() - : new NOOPCachePerformance(); - - performanceArray.push(perf); - - var cache = function (req, res, next) { - function bypass() { - debug('bypass detected, skipping cache.'); - return next(); - } - - // initial bypass chances - if (!opt.enabled) return bypass(); - if ( - req.headers['x-apicache-bypass'] || - req.headers['x-apicache-force-fetch'] - ) - return bypass(); - - // REMOVED IN 0.11.1 TO CORRECT MIDDLEWARE TOGGLE EXECUTE ORDER - // if (typeof middlewareToggle === 'function') { - // if (!middlewareToggle(req, res)) return bypass() - // } else if (middlewareToggle !== undefined && !middlewareToggle) { - // return bypass() - // } - - // embed timer - req.apicacheTimer = new Date(); - - // In Express 4.x the url is ambigious based on where a router is mounted. originalUrl will give the full Url - var key = req.originalUrl || req.url; - - // Remove querystring from key if jsonp option is enabled - if (opt.jsonp) { - key = url.parse(key).pathname; - } - - // add appendKey (either custom function or response path) - if (typeof opt.appendKey === 'function') { - key += '$$appendKey=' + opt.appendKey(req, res); - } else if (opt.appendKey.length > 0) { - var appendKey = req; - - for (var i = 0; i < opt.appendKey.length; i++) { - appendKey = appendKey[opt.appendKey[i]]; - } - key += '$$appendKey=' + appendKey; - } - - // attempt cache hit - var redis = opt.redisClient; - var cached = !redis ? memCache.getValue(key) : null; - - // send if cache hit from memory-cache - if (cached) { - var elapsed = new Date() - req.apicacheTimer; - debug( - 'sending cached (memory-cache) version of', - key, - logDuration(elapsed), - ); - - perf.hit(key); - return sendCachedResponse( - req, - res, - cached, - middlewareToggle, - next, - duration, - ); - } - - // send if cache hit from redis - if (redis && redis.connected) { - try { - redis.hgetall(key, function (err, obj) { - if (!err && obj && obj.response) { - var elapsed = new Date() - req.apicacheTimer; - debug( - 'sending cached (redis) version of', - key, - logDuration(elapsed), - ); - - perf.hit(key); - return sendCachedResponse( - req, - res, - JSON.parse(obj.response), - middlewareToggle, - next, - duration, - ); - } else { - perf.miss(key); - return makeResponseCacheable( - req, - res, - next, - key, - duration, - strDuration, - middlewareToggle, - ); - } - }); - } catch (err) { - // bypass redis on error - perf.miss(key); - return makeResponseCacheable( - req, - res, - next, - key, - duration, - strDuration, - middlewareToggle, - ); - } - } else { - perf.miss(key); - return makeResponseCacheable( - req, - res, - next, - key, - duration, - strDuration, - middlewareToggle, - ); - } - }; - - cache.options = options; - - return cache; - }; - - this.options = function (options) { - if (options) { - Object.assign(globalOptions, options); - syncOptions(); - - if ('defaultDuration' in options) { - // Convert the default duration to a number in milliseconds (if needed) - globalOptions.defaultDuration = parseDuration( - globalOptions.defaultDuration, - 3600000, - ); - } - - if (globalOptions.trackPerformance) { - debug( - 'WARNING: using trackPerformance flag can cause high memory usage!', - ); - } - - return this; - } else { - return globalOptions; - } - }; - - this.resetIndex = function () { - index = { - all: [], - groups: {}, - }; - }; - - this.newInstance = function (config) { - var instance = new ApiCache(); - - if (config) { - instance.options(config); - } - - return instance; - }; - - this.clone = function () { - return this.newInstance(this.options()); - }; - - // initialize index - this.resetIndex(); -} - -module.exports = new ApiCache(); diff --git a/netease_api/util/crypto.js b/netease_api/util/crypto.js deleted file mode 100644 index de80e15..0000000 --- a/netease_api/util/crypto.js +++ /dev/null @@ -1,67 +0,0 @@ -const crypto = require('crypto'); -const iv = Buffer.from('0102030405060708'); -const presetKey = Buffer.from('0CoJUm6Qyw8W8jud'); -const linuxapiKey = Buffer.from('rFgB&h#%2?^eDg:Q'); -const base62 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; -const publicKey = - '-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgtQn2JZ34ZC28NWYpAUd98iZ37BUrX/aKzmFbt7clFSs6sXqHauqKWqdtLkF2KexO40H1YTX8z2lSgBBOAxLsvaklV8k4cBFK9snQXE9/DDaFt6Rr7iVZMldczhC0JNgTz+SHXT6CBHuX3e9SdB1Ua44oncaTWz7OBGLbCiK45wIDAQAB\n-----END PUBLIC KEY-----'; -const eapiKey = 'e82ckenh8dichen8'; - -const aesEncrypt = (buffer, mode, key, iv) => { - const cipher = crypto.createCipheriv('aes-128-' + mode, key, iv); - return Buffer.concat([cipher.update(buffer), cipher.final()]); -}; - -const rsaEncrypt = (buffer, key) => { - buffer = Buffer.concat([Buffer.alloc(128 - buffer.length), buffer]); - return crypto.publicEncrypt( - { key: key, padding: crypto.constants.RSA_NO_PADDING }, - buffer, - ); -}; - -const weapi = (object) => { - const text = JSON.stringify(object); - const secretKey = crypto - .randomBytes(16) - .map((n) => base62.charAt(n % 62).charCodeAt()); - return { - params: aesEncrypt( - Buffer.from( - aesEncrypt(Buffer.from(text), 'cbc', presetKey, iv).toString('base64'), - ), - 'cbc', - secretKey, - iv, - ).toString('base64'), - encSecKey: rsaEncrypt(secretKey.reverse(), publicKey).toString('hex'), - }; -}; - -const linuxapi = (object) => { - const text = JSON.stringify(object); - return { - eparams: aesEncrypt(Buffer.from(text), 'ecb', linuxapiKey, '') - .toString('hex') - .toUpperCase(), - }; -}; - -const eapi = (url, object) => { - const text = typeof object === 'object' ? JSON.stringify(object) : object; - const message = `nobody${url}use${text}md5forencrypt`; - const digest = crypto.createHash('md5').update(message).digest('hex'); - const data = `${url}-36cd479b6b5-${text}-36cd479b6b5-${digest}`; - return { - params: aesEncrypt(Buffer.from(data), 'ecb', eapiKey, '') - .toString('hex') - .toUpperCase(), - }; -}; - -const decrypt = (cipherBuffer) => { - const decipher = crypto.createDecipheriv('aes-128-ecb', eapiKey, ''); - return Buffer.concat([decipher.update(cipherBuffer), decipher.final()]); -}; - -module.exports = { weapi, linuxapi, eapi, decrypt }; diff --git a/netease_api/util/index.js b/netease_api/util/index.js deleted file mode 100644 index 6241c2c..0000000 --- a/netease_api/util/index.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - toBoolean(val) { - if (typeof val === 'boolean') return val; - if (val === '') return val; - return val === 'true' || val == '1'; - }, - cookieToJson(cookie) { - if (!cookie) return {}; - let cookieArr = cookie.split(';'); - let obj = {}; - cookieArr.forEach((i) => { - let arr = i.split('='); - obj[arr[0]] = arr[1]; - }); - return obj; - }, -}; diff --git a/netease_api/util/memory-cache.js b/netease_api/util/memory-cache.js deleted file mode 100644 index 02e735a..0000000 --- a/netease_api/util/memory-cache.js +++ /dev/null @@ -1,63 +0,0 @@ -function MemoryCache() { - this.cache = {}; - this.size = 0; -} - -MemoryCache.prototype.add = function (key, value, time, timeoutCallback) { - var old = this.cache[key]; - var instance = this; - - var entry = { - value: value, - expire: time + Date.now(), - timeout: setTimeout(function () { - instance.delete(key); - return ( - timeoutCallback && - typeof timeoutCallback === 'function' && - timeoutCallback(value, key) - ); - }, time), - }; - - this.cache[key] = entry; - this.size = Object.keys(this.cache).length; - - return entry; -}; - -MemoryCache.prototype.delete = function (key) { - var entry = this.cache[key]; - - if (entry) { - clearTimeout(entry.timeout); - } - - delete this.cache[key]; - - this.size = Object.keys(this.cache).length; - - return null; -}; - -MemoryCache.prototype.get = function (key) { - var entry = this.cache[key]; - - return entry; -}; - -MemoryCache.prototype.getValue = function (key) { - var entry = this.get(key); - - return entry && entry.value; -}; - -MemoryCache.prototype.clear = function () { - Object.keys(this.cache).forEach(function (key) { - this.delete(key); - }, this); - - return true; -}; - -module.exports = MemoryCache; diff --git a/netease_api/util/request.js b/netease_api/util/request.js deleted file mode 100644 index 84d448d..0000000 --- a/netease_api/util/request.js +++ /dev/null @@ -1,177 +0,0 @@ -const encrypt = require('./crypto'); -const axios = require('axios'); -const queryString = require('querystring'); -const PacProxyAgent = require('pac-proxy-agent'); -const http = require('http'); -const https = require('https'); -const tunnel = require('tunnel'); -const qs = require('url'); -// request.debug = true // 开启可看到更详细信息 - -const chooseUserAgent = (ua = false) => { - const userAgentList = { - mobile: [ - // iOS 13.5.1 14.0 beta with safari - 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1', - 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.', - // iOS with qq micromsg - 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML like Gecko) Mobile/14A456 QQ/6.5.7.408 V1_IPH_SQ_6.5.7_1_APP_A Pixel/750 Core/UIWebView NetType/4G Mem/103', - 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.15(0x17000f27) NetType/WIFI Language/zh', - // Android -> Huawei Xiaomi - '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', - 'Mozilla/5.0 (Linux; U; Android 9; zh-cn; Redmi Note 8 Build/PKQ1.190616.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.141 Mobile Safari/537.36 XiaoMi/MiuiBrowser/12.5.22', - // Android + qq micromsg - 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2581 MMWEBSDK/200801 Mobile Safari/537.36 MMWEBID/3027 MicroMessenger/7.0.18.1740(0x27001235) Process/toolsmp WeChat/arm64 NetType/WIFI Language/zh_CN ABI/arm64', - 'Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; BKK-AL10 Build/HONORBKK-AL10) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/10.6 Mobile Safari/537.36', - ], - pc: [ - // macOS 10.15.6 Firefox / Chrome / Safari - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:80.0) Gecko/20100101 Firefox/80.0', - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.30 Safari/537.36', - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Safari/605.1.15', - // Windows 10 Firefox / Chrome / Edge - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0', - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.30 Safari/537.36', - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/13.10586', - // Linux 就算了 - ], - }; - let realUserAgentList = - userAgentList[ua] || userAgentList.mobile.concat(userAgentList.pc); - return ['mobile', 'pc', false].indexOf(ua) > -1 - ? realUserAgentList[Math.floor(Math.random() * realUserAgentList.length)] - : ua; -}; -const createRequest = (method, url, data, options) => { - return new Promise((resolve, reject) => { - let headers = { 'User-Agent': chooseUserAgent(options.ua) }; - if (method.toUpperCase() === 'POST') - headers['Content-Type'] = 'application/x-www-form-urlencoded'; - if (url.includes('music.163.com')) - headers['Referer'] = 'https://music.163.com'; - if (options.realIP) headers['X-Real-IP'] = options.realIP; - // headers['X-Real-IP'] = '118.88.88.88' - if (typeof options.cookie === 'object') - headers['Cookie'] = Object.keys(options.cookie) - .map( - (key) => - encodeURIComponent(key) + - '=' + - encodeURIComponent(options.cookie[key]), - ) - .join('; '); - else if (options.cookie) headers['Cookie'] = options.cookie; - - if (!headers['Cookie']) { - headers['Cookie'] = options.token || ''; - } - if (options.crypto === 'weapi') { - let csrfToken = (headers['Cookie'] || '').match(/_csrf=([^(;|$)]+)/); - data.csrf_token = csrfToken ? csrfToken[1] : ''; - data = encrypt.weapi(data); - url = url.replace(/\w*api/, 'weapi'); - } else if (options.crypto === 'linuxapi') { - data = encrypt.linuxapi({ - method: method, - url: url.replace(/\w*api/, 'api'), - params: data, - }); - headers['User-Agent'] = - 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'; - url = 'https://music.163.com/api/linux/forward'; - } else if (options.crypto === 'eapi') { - const cookie = options.cookie || {}; - const csrfToken = cookie['__csrf'] || ''; - const header = { - osver: cookie.osver, //系统版本 - deviceId: cookie.deviceId, //encrypt.base64.encode(imei + '\t02:00:00:00:00:00\t5106025eb79a5247\t70ffbaac7') - appver: cookie.appver || '6.1.1', // app版本 - versioncode: cookie.versioncode || '140', //版本号 - mobilename: cookie.mobilename, //设备model - buildver: cookie.buildver || Date.now().toString().substr(0, 10), - resolution: cookie.resolution || '1920x1080', //设备分辨率 - __csrf: csrfToken, - os: cookie.os || 'android', - channel: cookie.channel, - requestId: `${Date.now()}_${Math.floor(Math.random() * 1000) - .toString() - .padStart(4, '0')}`, - }; - if (cookie.MUSIC_U) header['MUSIC_U'] = cookie.MUSIC_U; - if (cookie.MUSIC_A) header['MUSIC_A'] = cookie.MUSIC_A; - headers['Cookie'] = Object.keys(header) - .map( - (key) => - encodeURIComponent(key) + '=' + encodeURIComponent(header[key]), - ) - .join('; '); - data.header = header; - data = encrypt.eapi(options.url, data); - url = url.replace(/\w*api/, 'eapi'); - } - - const answer = { status: 500, body: {}, cookie: [] }; - const settings = { - method: method, - url: url, - headers: headers, - data: queryString.stringify(data), - httpAgent: new http.Agent({ keepAlive: true }), - httpsAgent: new https.Agent({ keepAlive: true }), - }; - - if (options.crypto === 'eapi') settings.encoding = null; - - if (options.proxy) { - if (options.proxy.indexOf('pac') > -1) { - settings.httpAgent = new PacProxyAgent(options.proxy); - settings.httpsAgent = new PacProxyAgent(options.proxy); - } else { - var purl = qs.parse(options.proxy); - if (purl.hostname) { - const agent = tunnel.httpsOverHttp({ - proxy: { - host: purl.hostname, - port: purl.port || 80, - }, - }); - settings.httpsAgent = agent; - settings.httpAgent = agent; - settings.proxy = false; - } else { - console.error('代理配置无效,不使用代理'); - } - } - } - - axios(settings) - .then((res) => { - const body = res.data; - answer.cookie = (res.headers['set-cookie'] || []).map((x) => - x.replace(/\s*Domain=[^(;|$)]+;*/, ''), - ); - try { - answer.body = body; - answer.status = answer.body.code || res.status; - if (answer.body.code === 502) { - answer.status = 200; - } - } catch (e) { - answer.body = body; - answer.status = res.status; - } - - answer.status = - 100 < answer.status && answer.status < 600 ? answer.status : 400; - if (answer.status == 200) resolve(answer); - else reject(answer); - }) - .catch((err) => { - answer.status = 502; - answer.body = { code: 502, msg: err }; - reject(answer); - }); - }); -}; - -module.exports = createRequest; diff --git a/package.json b/package.json index 4186308..bb87fdd 100644 --- a/package.json +++ b/package.json @@ -1,70 +1,85 @@ { - "name": "YesPlayMusic", - "version": "0.2.2", + "name": "yesplaymusic", + "version": "0.4.9", "private": true, - "description": "A third party music application for Netease Cloud Music", - "author": "hawtim", + "description": "A third party music player for Netease Music", + "author": "qier222", "scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint", - "electron:build": "vue-cli-service electron:build -mwl -p never", - "electron:build-mac": "vue-cli-service electron:build -m -p never", - "electron:build-win": "vue-cli-service electron:build -w -p never", - "electron:build-linux": "vue-cli-service electron:build -l -p never", + "electron:build": "vue-cli-service electron:build -p never", + "electron:build-all": "vue-cli-service electron:build -p never -mwl", + "electron:build-mac": "vue-cli-service electron:build -p never -m", + "electron:build-win": "vue-cli-service electron:build -p never -w", + "electron:build-linux": "vue-cli-service electron:build -p never -l", "electron:serve": "vue-cli-service electron:serve", "electron:buildicon": "electron-icon-builder --input=./build/icons/icon.png --output=build --flatten", "electron:publish": "vue-cli-service electron:build -mwl -p always", "postinstall": "electron-builder install-app-deps", "postuninstall": "electron-builder install-app-deps", - "prettier": "npx prettier --write ./src ./script", - "netease_api:run": "cd ./netease_api && npm run start", - "netease_api:pull": "node script/pull.js", - "netease_api:install": "cd ./netease_api && npm install", - "netease_api:setup": "npm run netease_api:pull && npm run netease_api:install" + "prettier": "npx prettier --write ./src", + "netease_api:run": "npx NeteaseCloudMusicApi" }, "main": "background.js", + "engines": { + "node": "14 || 16" + }, "dependencies": { - "@nondanee/unblockneteasemusic": "^0.25.3", - "axios": "^0.21.0", - "big-integer": "^1.6.48", + "@unblockneteasemusic/rust-napi": "^0.4.0", + "NeteaseCloudMusicApi": "^4.23.3", + "axios": "^0.26.1", + "change-case": "^4.1.2", + "cli-color": "^2.0.0", + "color": "^4.2.3", "core-js": "^3.6.5", "crypto-js": "^4.0.0", "dayjs": "^1.8.36", - "electron": "11.0.2", - "electron-context-menu": "^2.3.0", + "dexie": "^3.0.3", + "discord-rich-presence": "^0.0.8", + "electron": "^13.6.7", + "electron-builder": "^23.0.0", + "electron-context-menu": "^3.1.2", "electron-debug": "^3.1.0", - "electron-devtools-installer": "^3.1.1", - "electron-icon-builder": "^1.0.2", - "electron-is-dev": "^1.2.0", - "electron-log": "^4.2.4", - "electron-updater": "^4.3.5", + "electron-devtools-installer": "^3.2", + "electron-icon-builder": "^2.0.1", + "electron-is-dev": "^2.0.0", + "electron-log": "^4.3.0", + "electron-store": "^8.0.1", + "electron-updater": "^5.0.1", + "esbuild": "^0.20.1", + "esbuild-loader": "^4.0.3", "express": "^4.17.1", "express-fileupload": "^1.2.0", + "express-http-proxy": "^1.6.2", "extract-zip": "^2.0.1", - "howler": "^2.2.0", + "howler": "^2.2.3", "js-cookie": "^2.2.1", - "localforage": "^1.9.0", + "jsbi": "^4.1.0", + "lodash": "^4.17.20", + "md5": "^2.3.0", + "mpris-service": "^2.1.2", + "music-metadata": "^7.5.3", + "node-vibrant": "^3.2.1-alpha.1", "nprogress": "^0.2.0", "pac-proxy-agent": "^4.1.0", "plyr": "^3.6.2", - "prettier": "2.1.2", + "qrcode": "^1.4.4", "register-service-worker": "^1.7.1", - "svg-sprite-loader": "^5.0.0", + "svg-sprite-loader": "^6.0.11", "tunnel": "^0.0.6", + "vscode-codicons": "^0.0.17", "vue": "^2.6.11", - "vue-analytics": "^5.22.1", - "vue-electron": "^1.0.6", - "vue-global-events": "^1.2.1", + "vue-clipboard2": "^0.3.1", + "vue-gtag": "1", "vue-i18n": "^8.22.0", "vue-router": "^3.4.3", "vue-slider-component": "^3.2.5", - "vuex": "^3.4.0" + "vuex": "^3.4.0", + "x11": "^2.3.0" }, "devDependencies": { - "@sentry/browser": "^5.27.0", - "@sentry/integrations": "^5.27.0", - "@sentry/tracing": "^5.27.0", + "@types/node": "^17.0.0", "@vue/cli-plugin-babel": "~4.5.0", "@vue/cli-plugin-eslint": "~4.5.0", "@vue/cli-plugin-pwa": "~4.5.0", @@ -72,13 +87,21 @@ "@vue/cli-service": "~4.5.0", "babel-eslint": "^10.1.0", "eslint": "^6.7.2", - "eslint-plugin-vue": "^6.2.2", + "eslint-config-prettier": "^8.1.0", + "eslint-plugin-prettier": "^3.3.1", + "eslint-plugin-vue": "^7.9.0", "husky": "^4.3.0", + "prettier": "2.5.1", "sass": "^1.26.11", "sass-loader": "^10.0.2", - "vue-cli-plugin-electron-builder": "~2.0.0-rc.4", + "vue-cli-plugin-electron-builder": "~2.1.1", "vue-template-compiler": "^2.6.11" }, + "resolutions": { + "icon-gen": "3.0.0", + "degenerator": "2.2.0", + "electron-builder": "^23.0.0" + }, "eslintConfig": { "root": true, "env": { @@ -87,6 +110,8 @@ }, "extends": [ "plugin:vue/essential", + "plugin:vue/recommended", + "plugin:prettier/recommended", "eslint:recommended" ], "parserOptions": { diff --git a/public/img/icons/exit.png b/public/img/icons/exit.png new file mode 100644 index 0000000..01e21b2 Binary files /dev/null and b/public/img/icons/exit.png differ diff --git a/public/img/icons/left.png b/public/img/icons/left.png new file mode 100644 index 0000000..9e49d7e Binary files /dev/null and b/public/img/icons/left.png differ diff --git a/public/img/icons/like.png b/public/img/icons/like.png new file mode 100644 index 0000000..4bea102 Binary files /dev/null and b/public/img/icons/like.png differ diff --git a/public/img/icons/menu-dark@88.png b/public/img/icons/menu-dark@88.png new file mode 100644 index 0000000..a2feb00 Binary files /dev/null and b/public/img/icons/menu-dark@88.png differ diff --git a/public/img/icons/menu-light@88.png b/public/img/icons/menu-light@88.png new file mode 100644 index 0000000..cc14a82 Binary files /dev/null and b/public/img/icons/menu-light@88.png differ diff --git a/public/img/icons/pause.png b/public/img/icons/pause.png new file mode 100644 index 0000000..509d738 Binary files /dev/null and b/public/img/icons/pause.png differ diff --git a/public/img/icons/play.png b/public/img/icons/play.png new file mode 100644 index 0000000..90537c8 Binary files /dev/null and b/public/img/icons/play.png differ diff --git a/public/img/icons/repeat.png b/public/img/icons/repeat.png new file mode 100644 index 0000000..d4c3fc7 Binary files /dev/null and b/public/img/icons/repeat.png differ diff --git a/public/img/icons/right.png b/public/img/icons/right.png new file mode 100644 index 0000000..50c2e75 Binary files /dev/null and b/public/img/icons/right.png differ diff --git a/public/img/icons/touchbar/like.png b/public/img/icons/touchbar/like.png deleted file mode 100644 index 5b0c483..0000000 Binary files a/public/img/icons/touchbar/like.png and /dev/null differ diff --git a/public/img/icons/touchbar/liked.png b/public/img/icons/touchbar/liked.png deleted file mode 100644 index 8b46ab5..0000000 Binary files a/public/img/icons/touchbar/liked.png and /dev/null differ diff --git a/public/img/icons/touchbar/next.png b/public/img/icons/touchbar/next.png deleted file mode 100644 index 374ff4e..0000000 Binary files a/public/img/icons/touchbar/next.png and /dev/null differ diff --git a/public/img/icons/touchbar/play.png b/public/img/icons/touchbar/play.png deleted file mode 100644 index 4551268..0000000 Binary files a/public/img/icons/touchbar/play.png and /dev/null differ diff --git a/public/img/icons/touchbar/previous.png b/public/img/icons/touchbar/previous.png deleted file mode 100644 index 7ce133e..0000000 Binary files a/public/img/icons/touchbar/previous.png and /dev/null differ diff --git a/public/img/icons/touchbar/repeat.png b/public/img/icons/touchbar/repeat.png deleted file mode 100644 index 29e000a..0000000 Binary files a/public/img/icons/touchbar/repeat.png and /dev/null differ diff --git a/public/img/icons/touchbar/search.png b/public/img/icons/touchbar/search.png deleted file mode 100644 index 642805f..0000000 Binary files a/public/img/icons/touchbar/search.png and /dev/null differ diff --git a/public/img/icons/touchbar/search2.png b/public/img/icons/touchbar/search2.png deleted file mode 100644 index d3905ae..0000000 Binary files a/public/img/icons/touchbar/search2.png and /dev/null differ diff --git a/public/img/icons/touchbar/shuffle.png b/public/img/icons/touchbar/shuffle.png deleted file mode 100644 index 787fc50..0000000 Binary files a/public/img/icons/touchbar/shuffle.png and /dev/null differ diff --git a/public/img/icons/unlike.png b/public/img/icons/unlike.png new file mode 100644 index 0000000..a0afa24 Binary files /dev/null and b/public/img/icons/unlike.png differ diff --git a/public/img/logos/lastfm.png b/public/img/logos/lastfm.png new file mode 100644 index 0000000..e3964f6 Binary files /dev/null and b/public/img/logos/lastfm.png differ diff --git a/public/img/logos/netease-music.png b/public/img/logos/netease-music.png index 268aa96..b14f263 100644 Binary files a/public/img/logos/netease-music.png and b/public/img/logos/netease-music.png differ diff --git a/public/img/logos/nyancat-stop.png b/public/img/logos/nyancat-stop.png new file mode 100644 index 0000000..72bf07e Binary files /dev/null and b/public/img/logos/nyancat-stop.png differ diff --git a/public/img/logos/yesplaymusic-white24x24.png b/public/img/logos/yesplaymusic-white24x24.png new file mode 100644 index 0000000..d8e4715 Binary files /dev/null and b/public/img/logos/yesplaymusic-white24x24.png differ diff --git a/public/img/touchbar/backward.png b/public/img/touchbar/backward.png new file mode 100644 index 0000000..83b2053 Binary files /dev/null and b/public/img/touchbar/backward.png differ diff --git a/public/img/touchbar/forward.png b/public/img/touchbar/forward.png new file mode 100644 index 0000000..5577bb5 Binary files /dev/null and b/public/img/touchbar/forward.png differ diff --git a/public/img/touchbar/like.png b/public/img/touchbar/like.png new file mode 100644 index 0000000..09f6534 Binary files /dev/null and b/public/img/touchbar/like.png differ diff --git a/public/img/touchbar/like_fill.png b/public/img/touchbar/like_fill.png new file mode 100644 index 0000000..bbc2727 Binary files /dev/null and b/public/img/touchbar/like_fill.png differ diff --git a/public/img/touchbar/next_up.png b/public/img/touchbar/next_up.png new file mode 100644 index 0000000..60d67a0 Binary files /dev/null and b/public/img/touchbar/next_up.png differ diff --git a/public/img/touchbar/page_next.png b/public/img/touchbar/page_next.png new file mode 100644 index 0000000..24ab389 Binary files /dev/null and b/public/img/touchbar/page_next.png differ diff --git a/public/img/touchbar/page_prev.png b/public/img/touchbar/page_prev.png new file mode 100644 index 0000000..52cb588 Binary files /dev/null and b/public/img/touchbar/page_prev.png differ diff --git a/public/img/touchbar/pause.png b/public/img/touchbar/pause.png new file mode 100644 index 0000000..083f680 Binary files /dev/null and b/public/img/touchbar/pause.png differ diff --git a/public/img/touchbar/play.png b/public/img/touchbar/play.png new file mode 100644 index 0000000..101b92f Binary files /dev/null and b/public/img/touchbar/play.png differ diff --git a/public/img/touchbar/search.png b/public/img/touchbar/search.png new file mode 100644 index 0000000..e62e725 Binary files /dev/null and b/public/img/touchbar/search.png differ diff --git a/public/index.html b/public/index.html index 193d42c..ca6d1ad 100644 --- a/public/index.html +++ b/public/index.html @@ -1,23 +1,25 @@ - - - - - - - <%= htmlWebpackPlugin.options.title %> - - - +
+ + + diff --git a/public/robots.txt b/public/robots.txt index eb05362..1f53798 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,2 +1,2 @@ User-agent: * -Disallow: +Disallow: / diff --git a/restyled.yml b/restyled.yml new file mode 100644 index 0000000..c31d3e8 --- /dev/null +++ b/restyled.yml @@ -0,0 +1,7 @@ +commit_template: 'style: with ${restyler.name}' +restylers: + - prettier + - prettier-json + - prettier-markdown + - prettier-yaml + - whitespace diff --git a/script/pull.js b/script/pull.js deleted file mode 100644 index 8f75eb8..0000000 --- a/script/pull.js +++ /dev/null @@ -1,103 +0,0 @@ -// node module -const fs = require("fs"); -const https = require("https"); -const resolve = require("path").resolve; -const join = require("path").resolve; -const extract = require("extract-zip"); - -// 函数参数 -const dest = resolve(__dirname, "../"); -const fileName = "NeteaseCloudMusicApi-master.zip"; -const options = { - hostname: "github.91chifun.workers.dev", - path: `//https://github.com/Binaryify/NeteaseCloudMusicApi/archive/master.zip`, -}; - -// 完整的流程控制 -/** - * 1. 检查本地文件是否已有 - * 2. 下载默认/指定版本的 zip 压缩包,等待下载 - * 3. 解压缩 - * 4. 进入目录安装依赖 npm install - */ - -function fix2(number) { - return number.toFixed(2); -} - -async function download(options, fileName, callback) { - return await new Promise((resolve, reject) => { - const destPath = join(__dirname, "../" + fileName); - // Check if exist - if (fs.existsSync(destPath)) return resolve(destPath); - - const file = fs.createWriteStream(destPath); - const request = https.get(options, (res) => { - let len = res.headers && parseInt(res.headers["content-length"], 10); - let cur = 0; - // 1048576 - bytes in 1Megabyte - const MEGA = 1048576; - let total = 0; - if (len) { - total = len / MEGA; - } - if (!len) { - console.log( - "Downloading, but can not get content-length, please be patient." - ); - } - res.on("data", (chunk) => { - if (len) { - cur += chunk.length; - console.log( - `Downloading ${fix2((100.0 * cur) / len)}% ${fix2( - cur / MEGA - )}/${fix2(total)}mb` - ); - } - }); - res.on("end", () => { - callback("Downloading complete!"); - }); - res.pipe(file); - file.on("finish", () => { - file.close(() => { - callback("File wrote complete!"); - resolve(destPath); - }); - }); - file.on("error", (err) => { - fs.unlink(destPath); - reject(err); - }); - request.on("error", (err) => { - console.log("Error: " + err.message); - }); - }); - }); -} - -async function unzip(source, target) { - try { - await extract(source, { - dir: target, - }); - console.log("Extraction complete"); - return true; - } catch (err) { - // handle any errors - if (err.message === "end of central directory record signature not found") { - console.log("Not a full_downloaded zip file, removed!"); - fs.unlinkSync(source); - } - return false; - } -} -// Download process -download(options, fileName, (text) => { - console.log(text); -}).then((path) => { - console.log(path); - // Unzip process - return unzip(path, dest); -}); diff --git a/src/App.vue b/src/App.vue index b1e0142..59392be 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,163 +1,148 @@ diff --git a/src/api/album.js b/src/api/album.js index ef39d14..18425d4 100644 --- a/src/api/album.js +++ b/src/api/album.js @@ -1,5 +1,6 @@ -import request from "@/utils/request"; -import { mapTrackPlayableStatus } from "@/utils/common"; +import request from '@/utils/request'; +import { mapTrackPlayableStatus } from '@/utils/common'; +import { cacheAlbum, getAlbumFromCache } from '@/utils/db'; /** * 获取专辑内容 @@ -7,15 +8,23 @@ import { mapTrackPlayableStatus } from "@/utils/common"; * @param {number} id */ export function getAlbum(id) { - return request({ - url: "/album", - method: "get", - params: { - id, - }, - }).then((data) => { - data.songs = mapTrackPlayableStatus(data.songs); - return data; + const fetchLatest = () => { + return request({ + url: '/album', + method: 'get', + params: { + id, + }, + }).then(data => { + cacheAlbum(id, data); + data.songs = mapTrackPlayableStatus(data.songs); + return data; + }); + }; + fetchLatest(); + + return getAlbumFromCache(id).then(result => { + return result ?? fetchLatest(); }); } @@ -32,8 +41,8 @@ export function getAlbum(id) { */ export function newAlbums(params) { return request({ - url: "/album/new", - method: "get", + url: '/album/new', + method: 'get', params, }); } @@ -46,8 +55,8 @@ export function newAlbums(params) { */ export function albumDynamicDetail(id) { return request({ - url: "/album/detail/dynamic", - method: "get", + url: '/album/detail/dynamic', + method: 'get', params: { id, timestamp: new Date().getTime() }, }); } @@ -63,8 +72,8 @@ export function albumDynamicDetail(id) { */ export function likeAAlbum(params) { return request({ - url: "/album/sub", - method: "post", + url: '/album/sub', + method: 'post', params, }); } diff --git a/src/api/artist.js b/src/api/artist.js index 08428b1..925df45 100644 --- a/src/api/artist.js +++ b/src/api/artist.js @@ -1,5 +1,7 @@ -import request from "@/utils/request"; -import { mapTrackPlayableStatus } from "@/utils/common"; +import request from '@/utils/request'; +import { mapTrackPlayableStatus } from '@/utils/common'; +import { isAccountLoggedIn } from '@/utils/auth'; +import { getTrackDetail } from '@/api/track'; /** * 获取歌手单曲 @@ -8,13 +10,19 @@ import { mapTrackPlayableStatus } from "@/utils/common"; */ export function getArtist(id) { return request({ - url: "/artists", - method: "get", + url: '/artists', + method: 'get', params: { id, timestamp: new Date().getTime(), }, - }).then((data) => { + }).then(async data => { + if (!isAccountLoggedIn()) { + const trackIDs = data.hotSongs.map(t => t.id); + const tracks = await getTrackDetail(trackIDs.join(',')); + data.hotSongs = tracks.songs; + return data; + } data.hotSongs = mapTrackPlayableStatus(data.hotSongs); return data; }); @@ -33,8 +41,8 @@ export function getArtist(id) { */ export function getArtistAlbum(params) { return request({ - url: "/artist/album", - method: "get", + url: '/artist/album', + method: 'get', params, }); } @@ -50,12 +58,14 @@ export function getArtistAlbum(params) { * @param {number=} type */ export function toplistOfArtists(type = null) { + let params = {}; + if (type) { + params.type = type; + } return request({ - url: "/toplist/artist", - method: "get", - params: { - type, - }, + url: '/toplist/artist', + method: 'get', + params, }); } /** @@ -67,8 +77,8 @@ export function toplistOfArtists(type = null) { */ export function artistMv(params) { return request({ - url: "/artist/mv", - method: "get", + url: '/artist/mv', + method: 'get', params, }); } @@ -84,8 +94,22 @@ export function artistMv(params) { */ export function followAArtist(params) { return request({ - url: "/artist/sub", - method: "post", + url: '/artist/sub', + method: 'post', params, }); } + +/** + * 相似歌手 + * 说明 : 调用此接口 , 传入歌手 id, 可获得相似歌手 + * - id: 歌手 id + * @param {number} id + */ +export function similarArtists(id) { + return request({ + url: '/simi/artist', + method: 'post', + params: { id }, + }); +} diff --git a/src/api/auth.js b/src/api/auth.js index 461ac01..294f551 100644 --- a/src/api/auth.js +++ b/src/api/auth.js @@ -1,4 +1,4 @@ -import request from "@/utils/request"; +import request from '@/utils/request'; /** * 手机登录 @@ -14,11 +14,12 @@ import request from "@/utils/request"; */ export function loginWithPhone(params) { return request({ - url: "/login/cellphone", - method: "post", + url: '/login/cellphone', + method: 'post', params, }); } + /** * 邮箱登录 * - email: 163 网易邮箱 @@ -31,12 +32,60 @@ export function loginWithPhone(params) { */ export function loginWithEmail(params) { return request({ - url: "/login", - method: "post", + url: '/login', + method: 'post', params, }); } +/** + * 二维码key生成接口 + */ +export function loginQrCodeKey() { + return request({ + url: '/login/qr/key', + method: 'get', + params: { + timestamp: new Date().getTime(), + }, + }); +} + +/** + * 二维码生成接口 + * 说明: 调用此接口传入上一个接口生成的key可生成二维码图片的base64和二维码信息, + * 可使用base64展示图片,或者使用二维码信息内容自行使用第三方二维码生产库渲染二维码 + * @param {Object} params + * @param {string} params.key + * @param {string=} params.qrimg 传入后会额外返回二维码图片base64编码 + */ +export function loginQrCodeCreate(params) { + return request({ + url: '/login/qr/create', + method: 'get', + params: { + ...params, + timestamp: new Date().getTime(), + }, + }); +} + +/** + * 二维码检测扫码状态接口 + * 说明: 轮询此接口可获取二维码扫码状态,800为二维码过期,801为等待扫码,802为待确认,803为授权登录成功(803状态码下会返回cookies) + * @param {string} key + */ +export function loginQrCodeCheck(key) { + return request({ + url: '/login/qr/check', + method: 'get', + params: { + key, + timestamp: new Date().getTime(), + }, + }); +} + /** * 刷新登录 * 说明 : 调用此接口 , 可刷新登录状态 @@ -44,8 +93,8 @@ export function loginWithEmail(params) { */ export function refreshCookie() { return request({ - url: "/login/refresh", - method: "post", + url: '/login/refresh', + method: 'post', }); } @@ -55,7 +104,7 @@ export function refreshCookie() { */ export function logout() { return request({ - url: "/logout", - method: "post", + url: '/logout', + method: 'post', }); } diff --git a/src/api/lastfm.js b/src/api/lastfm.js new file mode 100644 index 0000000..41ad9c5 --- /dev/null +++ b/src/api/lastfm.js @@ -0,0 +1,80 @@ +// Last.fm API documents 👉 https://www.last.fm/api + +import axios from 'axios'; +import md5 from 'crypto-js/md5'; + +const apiKey = process.env.VUE_APP_LASTFM_API_KEY; +const apiSharedSecret = process.env.VUE_APP_LASTFM_API_SHARED_SECRET; +const baseUrl = window.location.origin; +const url = 'https://ws.audioscrobbler.com/2.0/'; + +const sign = params => { + const sortParamsKeys = Object.keys(params).sort(); + const sortedParams = sortParamsKeys.reduce((acc, key) => { + acc[key] = params[key]; + return acc; + }, {}); + let signature = ''; + for (const [key, value] of Object.entries(sortedParams)) { + signature += `${key}${value}`; + } + return md5(signature + apiSharedSecret).toString(); +}; + +export function auth() { + const url = process.env.IS_ELECTRON + ? `https://www.last.fm/api/auth/?api_key=${apiKey}&cb=${baseUrl}/#/lastfm/callback` + : `https://www.last.fm/api/auth/?api_key=${apiKey}&cb=${baseUrl}/lastfm/callback`; + window.open(url); +} + +export function authGetSession(token) { + const signature = md5( + `api_key${apiKey}methodauth.getSessiontoken${token}${apiSharedSecret}` + ).toString(); + return axios({ + url, + method: 'GET', + params: { + method: 'auth.getSession', + format: 'json', + api_key: apiKey, + api_sig: signature, + token, + }, + }); +} + +export function trackUpdateNowPlaying(params) { + params.api_key = apiKey; + params.method = 'track.updateNowPlaying'; + params.sk = JSON.parse(localStorage.getItem('lastfm'))['key']; + const signature = sign(params); + + return axios({ + url, + method: 'POST', + params: { + ...params, + api_sig: signature, + format: 'json', + }, + }); +} + +export function trackScrobble(params) { + params.api_key = apiKey; + params.method = 'track.scrobble'; + params.sk = JSON.parse(localStorage.getItem('lastfm'))['key']; + const signature = sign(params); + + return axios({ + url, + method: 'POST', + params: { + ...params, + api_sig: signature, + format: 'json', + }, + }); +} diff --git a/src/api/mv.js b/src/api/mv.js index f294785..ecd2b10 100644 --- a/src/api/mv.js +++ b/src/api/mv.js @@ -1,4 +1,4 @@ -import request from "@/utils/request"; +import request from '@/utils/request'; /** * 获取 mv 数据 @@ -9,8 +9,8 @@ import request from "@/utils/request"; */ export function mvDetail(mvid) { return request({ - url: "/mv/detail", - method: "get", + url: '/mv/detail', + method: 'get', params: { mvid, timestamp: new Date().getTime(), @@ -30,8 +30,8 @@ export function mvDetail(mvid) { */ export function mvUrl(params) { return request({ - url: "/mv/url", - method: "get", + url: '/mv/url', + method: 'get', params, }); } @@ -43,8 +43,8 @@ export function mvUrl(params) { */ export function simiMv(mvid) { return request({ - url: "/simi/mv", - method: "get", + url: '/simi/mv', + method: 'get', params: { mvid }, }); } @@ -62,8 +62,8 @@ export function simiMv(mvid) { export function likeAMV(params) { params.timestamp = new Date().getTime(); return request({ - url: "/mv/sub", - method: "post", + url: '/mv/sub', + method: 'post', params, }); } diff --git a/src/api/others.js b/src/api/others.js index f63423a..5c3cd63 100644 --- a/src/api/others.js +++ b/src/api/others.js @@ -1,5 +1,5 @@ -import request from "@/utils/request"; -import { mapTrackPlayableStatus } from "@/utils/common"; +import request from '@/utils/request'; +import { mapTrackPlayableStatus } from '@/utils/common'; /** * 搜索 @@ -18,12 +18,33 @@ import { mapTrackPlayableStatus } from "@/utils/common"; */ export function search(params) { return request({ - url: "/search", - method: "get", + url: '/search', + method: 'get', params, - }).then((data) => { - if (data.result.song !== undefined) + }).then(data => { + if (data.result?.song !== undefined) data.result.song.songs = mapTrackPlayableStatus(data.result.song.songs); return data; }); } + +export function personalFM() { + return request({ + url: '/personal_fm', + method: 'get', + params: { + timestamp: new Date().getTime(), + }, + }); +} + +export function fmTrash(id) { + return request({ + url: '/fm_trash', + method: 'post', + params: { + timestamp: new Date().getTime(), + id, + }, + }); +} diff --git a/src/api/playlist.js b/src/api/playlist.js index 6c761da..08177ea 100644 --- a/src/api/playlist.js +++ b/src/api/playlist.js @@ -1,5 +1,5 @@ -import request from "@/utils/request"; -import { mapTrackPlayableStatus } from "@/utils/common"; +import request from '@/utils/request'; +import { mapTrackPlayableStatus } from '@/utils/common'; /** * 推荐歌单 @@ -11,8 +11,8 @@ import { mapTrackPlayableStatus } from "@/utils/common"; */ export function recommendPlaylist(params) { return request({ - url: "/personalized", - method: "get", + url: '/personalized', + method: 'get', params, }); } @@ -24,9 +24,12 @@ export function recommendPlaylist(params) { */ export function dailyRecommendPlaylist(params) { return request({ - url: "/recommend/resource", - method: "get", - params, + url: '/recommend/resource', + method: 'get', + params: { + params, + timestamp: Date.now(), + }, }); } /** @@ -43,14 +46,16 @@ export function getPlaylistDetail(id, noCache = false) { let params = { id }; if (noCache) params.timestamp = new Date().getTime(); return request({ - url: "/playlist/detail", - method: "get", + url: '/playlist/detail', + method: 'get', params, - }).then((data) => { - data.playlist.tracks = mapTrackPlayableStatus( - data.playlist.tracks, - data.privileges || [] - ); + }).then(data => { + if (data.playlist) { + data.playlist.tracks = mapTrackPlayableStatus( + data.playlist.tracks, + data.privileges || [] + ); + } return data; }); } @@ -67,8 +72,8 @@ export function getPlaylistDetail(id, noCache = false) { */ export function highQualityPlaylist(params) { return request({ - url: "/top/playlist/highquality", - method: "get", + url: '/top/playlist/highquality', + method: 'get', params, }); } @@ -86,8 +91,8 @@ export function highQualityPlaylist(params) { */ export function topPlaylist(params) { return request({ - url: "/top/playlist", - method: "get", + url: '/top/playlist', + method: 'get', params, }); } @@ -98,20 +103,22 @@ export function topPlaylist(params) { */ export function playlistCatlist() { return request({ - url: "/playlist/catlist", - method: "get", + url: '/playlist/catlist', + method: 'get', }); } + /** * 所有榜单 * 说明 : 调用此接口,可获取所有榜单 接口地址 : /toplist */ export function toplists() { return request({ - url: "/toplist", - method: "get", + url: '/toplist', + method: 'get', }); } + /** * 收藏/取消收藏歌单 * 说明 : 调用此接口, 传入类型和歌单 id 可收藏歌单或者取消收藏歌单 @@ -122,9 +129,101 @@ export function toplists() { * @param {number} params.id */ export function subscribePlaylist(params) { + params.timestamp = new Date().getTime(); return request({ - url: "/playlist/subscribe", - method: "get", + url: '/playlist/subscribe', + method: 'post', + params, + }); +} + +/** + * 删除歌单 + * 说明 : 调用此接口 , 传入歌单id可删除歌单 + * - id : 歌单id,可多个,用逗号隔开 + * * @param {number} id + */ +export function deletePlaylist(id) { + return request({ + url: '/playlist/delete', + method: 'post', + params: { id }, + }); +} + +/** + * 新建歌单 + * 说明 : 调用此接口 , 传入歌单名字可新建歌单 + * - name : 歌单名 + * - privacy : 是否设置为隐私歌单,默认否,传'10'则设置成隐私歌单 + * - type : 歌单类型,默认'NORMAL',传 'VIDEO'则为视频歌单 + * @param {Object} params + * @param {string} params.name + * @param {number} params.privacy + * @param {string} params.type + */ +export function createPlaylist(params) { + params.timestamp = new Date().getTime(); + return request({ + url: '/playlist/create', + method: 'post', + params, + }); +} + +/** + * 对歌单添加或删除歌曲 + * 说明 : 调用此接口 , 可以添加歌曲到歌单或者从歌单删除某首歌曲 ( 需要登录 ) + * - op: 从歌单增加单曲为 add, 删除为 del + * - pid: 歌单 id tracks: 歌曲 id,可多个,用逗号隔开 + * @param {Object} params + * @param {string} params.op + * @param {string} params.pid + */ +export function addOrRemoveTrackFromPlaylist(params) { + params.timestamp = new Date().getTime(); + return request({ + url: '/playlist/tracks', + method: 'post', + params, + }); +} + +/** + * 每日推荐歌曲 + * 说明 : 调用此接口 , 可获得每日推荐歌曲 ( 需要登录 ) + * @param {Object} params + * @param {string} params.op + * @param {string} params.pid + */ +export function dailyRecommendTracks() { + return request({ + url: '/recommend/songs', + method: 'get', + params: { timestamp: new Date().getTime() }, + }).then(result => { + result.data.dailySongs = mapTrackPlayableStatus( + result.data.dailySongs, + result.data.privileges + ); + return result; + }); +} + +/** + * 心动模式/智能播放 + * 说明 : 登录后调用此接口 , 可获取心动模式/智能播放列表 必选参数 : id : 歌曲 id + * - id : 歌曲 id + * - pid : 歌单 id + * - sid : 要开始播放的歌曲的 id (可选参数) + * @param {Object} params + * @param {number=} params.id + * @param {number=} params.pid + */ +export function intelligencePlaylist(params) { + return request({ + url: '/playmode/intelligence/list', + method: 'get', params, }); } diff --git a/src/api/track.js b/src/api/track.js index 43a7d2a..490c91c 100644 --- a/src/api/track.js +++ b/src/api/track.js @@ -1,6 +1,13 @@ -import store from "@/store"; -import request from "@/utils/request"; -import { mapTrackPlayableStatus } from "@/utils/common"; +import store from '@/store'; +import request from '@/utils/request'; +import { mapTrackPlayableStatus } from '@/utils/common'; +import { + cacheTrackDetail, + getTrackDetailFromCache, + cacheLyric, + getLyricFromCache, +} from '@/utils/db'; + /** * 获取音乐 url * 说明 : 使用歌单详情接口后 , 能得到的音乐的 id, 但不能得到的音乐 url, 调用此接口, 传入的音乐 id( 可多个 , 用逗号隔开 ), 可以获取对应的音乐的 url, @@ -8,51 +15,85 @@ import { mapTrackPlayableStatus } from "@/utils/common"; * @param {string} id - 音乐的 id,例如 id=405998841,33894312 */ export function getMP3(id) { - let br = - store.state.settings?.musicQuality !== undefined - ? store.state.settings.musicQuality - : 320000; + const getBr = () => { + // 当返回的 quality >= 400000时,就会优先返回 hi-res + const quality = store.state.settings?.musicQuality ?? '320000'; + return quality === 'flac' ? '350000' : quality; + }; + return request({ - url: "/song/url", - method: "get", + url: '/song/url', + method: 'get', params: { id, - br, + br: getBr(), }, }); } + /** * 获取歌曲详情 * 说明 : 调用此接口 , 传入音乐 id(支持多个 id, 用 , 隔开), 可获得歌曲详情(注意:歌曲封面现在需要通过专辑内容接口获取) * @param {string} ids - 音乐 id, 例如 ids=405998841,33894312 */ export function getTrackDetail(ids) { - return request({ - url: "/song/detail", - method: "get", - params: { - ids, - }, - }).then((data) => { - data.songs = mapTrackPlayableStatus(data.songs, data.privileges); - return data; + const fetchLatest = () => { + return request({ + url: '/song/detail', + method: 'get', + params: { + ids, + }, + }).then(data => { + data.songs.map(song => { + const privileges = data.privileges.find(t => t.id === song.id); + cacheTrackDetail(song, privileges); + }); + data.songs = mapTrackPlayableStatus(data.songs, data.privileges); + return data; + }); + }; + fetchLatest(); + + let idsInArray = [String(ids)]; + if (typeof ids === 'string') { + idsInArray = ids.split(','); + } + + return getTrackDetailFromCache(idsInArray).then(result => { + if (result) { + result.songs = mapTrackPlayableStatus(result.songs, result.privileges); + } + return result ?? fetchLatest(); }); } + /** * 获取歌词 * 说明 : 调用此接口 , 传入音乐 id 可获得对应音乐的歌词 ( 不需要登录 ) * @param {number} id - 音乐 id */ - export function getLyric(id) { - return request({ - url: "/lyric", - method: "get", - params: { - id, - }, + const fetchLatest = () => { + return request({ + url: '/lyric', + method: 'get', + params: { + id, + }, + }).then(result => { + cacheLyric(id, result); + return result; + }); + }; + + fetchLatest(); + + return getLyricFromCache(id).then(result => { + return result ?? fetchLatest(); }); } + /** * 新歌速递 * 说明 : 调用此接口 , 可获取新歌速递 @@ -60,13 +101,14 @@ export function getLyric(id) { */ export function topSong(type) { return request({ - url: "/top/song", - method: "get", + url: '/top/song', + method: 'get', params: { type, }, }); } + /** * 喜欢音乐 * 说明 : 调用此接口 , 传入音乐 id, 可喜欢该音乐 @@ -79,8 +121,8 @@ export function topSong(type) { export function likeATrack(params) { params.timestamp = new Date().getTime(); return request({ - url: "/like", - method: "get", + url: '/like', + method: 'get', params, }); } @@ -99,8 +141,8 @@ export function likeATrack(params) { export function scrobble(params) { params.timestamp = new Date().getTime(); return request({ - url: "/scrobble", - method: "get", + url: '/scrobble', + method: 'get', params, }); } diff --git a/src/api/user.js b/src/api/user.js index aeeb719..ec02014 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -1,4 +1,4 @@ -import request from "@/utils/request"; +import request from '@/utils/request'; /** * 获取用户详情 @@ -8,10 +8,25 @@ import request from "@/utils/request"; */ export function userDetail(uid) { return request({ - url: "/user/detail", - method: "get", + url: '/user/detail', + method: 'get', params: { uid, + timestamp: new Date().getTime(), + }, + }); +} + +/** + * 获取账号详情 + * 说明 : 登录后调用此接口 ,可获取用户账号信息 + */ +export function userAccount() { + return request({ + url: '/user/account', + method: 'get', + params: { + timestamp: new Date().getTime(), }, }); } @@ -29,8 +44,25 @@ export function userDetail(uid) { */ export function userPlaylist(params) { return request({ - url: "/user/playlist", - method: "get", + url: '/user/playlist', + method: 'get', + params, + }); +} + +/** + * 获取用户播放记录 + * 说明 : 登录后调用此接口 , 传入用户 id, 可获取用户播放记录 + * - uid : 用户 id + * - type : type=1 时只返回 weekData, type=0 时返回 allData + * @param {Object} params + * @param {number} params.uid + * @param {number} params.type + */ +export function userPlayHistory(params) { + return request({ + url: '/user/record', + method: 'get', params, }); } @@ -43,8 +75,8 @@ export function userPlaylist(params) { */ export function userLikedSongsIDs(uid) { return request({ - url: "/likelist", - method: "get", + url: '/likelist', + method: 'get', params: { uid, timestamp: new Date().getTime(), @@ -60,8 +92,8 @@ export function userLikedSongsIDs(uid) { */ export function dailySignin(type = 0) { return request({ - url: "/daily_signin", - method: "post", + url: '/daily_signin', + method: 'post', params: { type, timestamp: new Date().getTime(), @@ -72,17 +104,18 @@ export function dailySignin(type = 0) { /** * 获取收藏的专辑(需要登录) * 说明 : 调用此接口可获取到用户收藏的专辑 - * - limit : 返回数量 , 默认为 30 - * - offset : 偏移数量,用于分页 , 如 :( 页数 -1)*30, 其中 30 为 limit 的值 , 默认为 0 + * - limit : 返回数量 , 默认为 25 + * - offset : 偏移数量,用于分页 , 如 :( 页数 -1)*25, 其中 25 为 limit 的值 , 默认为 0 * @param {Object} params * @param {number} params.limit * @param {number=} params.offset */ -export function likedAlbums() { +export function likedAlbums(params) { return request({ - url: "/album/sublist", - method: "get", + url: '/album/sublist', + method: 'get', params: { + limit: params.limit, timestamp: new Date().getTime(), }, }); @@ -92,11 +125,12 @@ export function likedAlbums() { * 获取收藏的歌手(需要登录) * 说明 : 调用此接口可获取到用户收藏的歌手 */ -export function likedArtists() { +export function likedArtists(params) { return request({ - url: "/artist/sublist", - method: "get", + url: '/artist/sublist', + method: 'get', params: { + limit: params.limit, timestamp: new Date().getTime(), }, }); @@ -106,12 +140,82 @@ export function likedArtists() { * 获取收藏的MV(需要登录) * 说明 : 调用此接口可获取到用户收藏的MV */ -export function likedMVs() { +export function likedMVs(params) { return request({ - url: "/mv/sublist", - method: "get", + url: '/mv/sublist', + method: 'get', params: { + limit: params.limit, timestamp: new Date().getTime(), }, }); } + +/** + * 上传歌曲到云盘(需要登录) + */ +export function uploadSong(file) { + let formData = new FormData(); + formData.append('songFile', file); + return request({ + url: '/cloud', + method: 'post', + params: { + timestamp: new Date().getTime(), + }, + data: formData, + headers: { + 'Content-Type': 'multipart/form-data', + }, + timeout: 200000, + }).catch(error => { + alert(`上传失败,Error: ${error}`); + }); +} + +/** + * 获取云盘歌曲(需要登录) + * 说明 : 登录后调用此接口 , 可获取云盘数据 , 获取的数据没有对应 url, 需要再调用一 次 /song/url 获取 url + * - limit : 返回数量 , 默认为 200 + * - offset : 偏移数量,用于分页 , 如 :( 页数 -1)*200, 其中 200 为 limit 的值 , 默认为 0 + * @param {Object} params + * @param {number} params.limit + * @param {number=} params.offset + */ +export function cloudDisk(params = {}) { + params.timestamp = new Date().getTime(); + return request({ + url: '/user/cloud', + method: 'get', + params, + }); +} + +/** + * 获取云盘歌曲详情(需要登录) + */ +export function cloudDiskTrackDetail(id) { + return request({ + url: '/user/cloud/detail', + method: 'get', + params: { + timestamp: new Date().getTime(), + id, + }, + }); +} + +/** + * 删除云盘歌曲(需要登录) + * @param {Array} id + */ +export function cloudDiskTrackDelete(id) { + return request({ + url: '/user/cloud/del', + method: 'get', + params: { + timestamp: new Date().getTime(), + id, + }, + }); +} diff --git a/src/assets/css/global.scss b/src/assets/css/global.scss new file mode 100644 index 0000000..00c3915 --- /dev/null +++ b/src/assets/css/global.scss @@ -0,0 +1,135 @@ +@font-face { + font-family: 'Barlow'; + font-weight: normal; + src: url('~@/assets/fonts/Barlow-Regular.woff2') format('woff2'), + url('~@/assets/fonts/Barlow-Regular.ttf') format('truetype'); +} +@font-face { + font-family: 'Barlow'; + font-weight: medium; + src: url('~@/assets/fonts/Barlow-Medium.woff2') format('woff2'), + url('~@/assets/fonts/Barlow-Medium.ttf') format('truetype'); +} +@font-face { + font-family: 'Barlow'; + font-weight: 600; + src: url('~@/assets/fonts/Barlow-SemiBold.woff2') format('woff2'), + url('~@/assets/fonts/Barlow-SemiBold.ttf') format('truetype'); +} +@font-face { + font-family: 'Barlow'; + font-weight: bold; + src: url('~@/assets/fonts/Barlow-Bold.woff2') format('woff2'), + url('~@/assets/fonts/Barlow-Bold.ttf') format('truetype'); +} +@font-face { + font-family: 'Barlow'; + font-weight: 800; + src: url('~@/assets/fonts/Barlow-ExtraBold.woff2') format('woff2'), + url('~@/assets/fonts/Barlow-ExtraBold.ttf') format('truetype'); +} +@font-face { + font-family: 'Barlow'; + font-weight: 900; + src: url('~@/assets/fonts/Barlow-Black.woff2') format('woff2'), + url('~@/assets/fonts/Barlow-Black.ttf') format('truetype'); +} + +:root { + --color-body-bg: #ffffff; + --color-text: #000; + --color-primary: #335eea; + --color-primary-bg: #eaeffd; + --color-secondary: #7a7a7b; + --color-secondary-bg: #f5f5f7; + --color-navbar-bg: rgba(255, 255, 255, 0.86); + --color-primary-bg-for-transparent: rgba(189, 207, 255, 0.28); + --color-secondary-bg-for-transparent: rgba(209, 209, 214, 0.28); + --html-overflow-y: overlay; +} + +[data-theme='dark'] { + --color-body-bg: #222222; + --color-text: #ffffff; + --color-primary: #335eea; + --color-primary-bg: #bbcdff; + --color-secondary: #7a7a7b; + --color-secondary-bg: #323232; + --color-navbar-bg: rgba(34, 34, 34, 0.86); + --color-primary-bg-for-transparent: rgba(255, 255, 255, 0.12); + --color-secondary-bg-for-transparent: rgba(255, 255, 255, 0.08); +} + +#app, +input { + font-family: 'Barlow', ui-sans-serif, system-ui, -apple-system, + BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, + Source Han Sans SC, Noto Sans CJK SC, WenQuanYi Micro Hei, sans-serif, + microsoft uighur; +} +body { + background-color: var(--color-body-bg); +} + +html { + overflow-y: var(--html-overflow-y); + min-width: 768px; + overscroll-behavior: none; +} + +select, +button { + font-family: inherit; +} +button { + background: none; + border: none; + cursor: pointer; + user-select: none; +} +input, +button { + &:focus { + outline: none; + } +} +a { + color: inherit; + text-decoration: none; + cursor: pointer; + &:hover { + text-decoration: underline; + } +} + +[data-electron='yes'] { + button, + .navigation-links a, + .playlist-info .description { + cursor: default !important; + } +} + +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + background: transparent; + border-left: 1px solid rgba(128, 128, 128, 0.18); + background: var(--color-body-bg); +} + +::-webkit-scrollbar-thumb { + -webkit-border-radius: 10px; + border-radius: 10px; + background: rgba(128, 128, 128, 0.38); +} + +[data-theme='dark'] ::-webkit-scrollbar-thumb { + background: var(--color-secondary-bg); +} + +.user-select-none { + user-select: none; +} diff --git a/src/assets/css/plyr.css b/src/assets/css/plyr.css index 584ba89..1a128f0 100644 --- a/src/assets/css/plyr.css +++ b/src/assets/css/plyr.css @@ -265,17 +265,17 @@ a.plyr__control::before { display: none; } -.plyr [data-plyr="airplay"], -.plyr [data-plyr="captions"], -.plyr [data-plyr="fullscreen"], -.plyr [data-plyr="pip"] { +.plyr [data-plyr='airplay'], +.plyr [data-plyr='captions'], +.plyr [data-plyr='fullscreen'], +.plyr [data-plyr='pip'] { display: none; } -.plyr--airplay-supported [data-plyr="airplay"], -.plyr--captions-enabled [data-plyr="captions"], -.plyr--fullscreen-enabled [data-plyr="fullscreen"], -.plyr--pip-supported [data-plyr="pip"] { +.plyr--airplay-supported [data-plyr='airplay'], +.plyr--captions-enabled [data-plyr='captions'], +.plyr--fullscreen-enabled [data-plyr='fullscreen'], +.plyr--pip-supported [data-plyr='pip'] { display: inline-block; } @@ -288,11 +288,11 @@ a.plyr__control::before { transition: transform 0.3s ease; } -.plyr__menu .plyr__control[aria-expanded="true"] svg { +.plyr__menu .plyr__control[aria-expanded='true'] svg { transform: rotate(90deg); } -.plyr__menu .plyr__control[aria-expanded="true"] .plyr__tooltip { +.plyr__menu .plyr__control[aria-expanded='true'] .plyr__tooltip { display: none; } @@ -327,7 +327,7 @@ a.plyr__control::before { border: var(--plyr-menu-arrow-size, 4px) solid transparent; border-top-color: rgba(255, 255, 255, 0.9); border-top-color: var(--plyr-menu-background, rgba(255, 255, 255, 0.9)); - content: ""; + content: ''; height: 0; position: absolute; right: calc(((18px / 2) + calc(10px * 0.7)) - (4px / 2)); @@ -341,18 +341,18 @@ a.plyr__control::before { width: 0; } -.plyr__menu__container [role="menu"] { +.plyr__menu__container [role='menu'] { padding: calc(10px * 0.7); padding: calc(var(--plyr-control-spacing, 10px) * 0.7); } -.plyr__menu__container [role="menuitem"], -.plyr__menu__container [role="menuitemradio"] { +.plyr__menu__container [role='menuitem'], +.plyr__menu__container [role='menuitemradio'] { margin-top: 2px; } -.plyr__menu__container [role="menuitem"]:first-child, -.plyr__menu__container [role="menuitemradio"]:first-child { +.plyr__menu__container [role='menuitem']:first-child, +.plyr__menu__container [role='menuitemradio']:first-child { margin-top: 0; } @@ -386,7 +386,7 @@ a.plyr__control::before { .plyr__menu__container .plyr__control::after { border: 4px solid transparent; border: var(--plyr-menu-item-arrow-size, 4px) solid transparent; - content: ""; + content: ''; position: absolute; top: 50%; transform: translateY(-50%); @@ -441,7 +441,7 @@ a.plyr__control::before { background: var(--plyr-menu-back-border-color, #dcdfe5); box-shadow: 0 1px 0 #fff; box-shadow: 0 1px 0 var(--plyr-menu-back-border-shadow-color, #fff); - content: ""; + content: ''; height: 1px; left: 0; margin-top: calc(calc(10px * 0.7) / 2); @@ -457,19 +457,19 @@ a.plyr__control::before { border-right-color: currentColor; } -.plyr__menu__container .plyr__control[role="menuitemradio"] { +.plyr__menu__container .plyr__control[role='menuitemradio'] { padding-left: calc(10px * 0.7); padding-left: calc(var(--plyr-control-spacing, 10px) * 0.7); } -.plyr__menu__container .plyr__control[role="menuitemradio"]::after, -.plyr__menu__container .plyr__control[role="menuitemradio"]::before { +.plyr__menu__container .plyr__control[role='menuitemradio']::after, +.plyr__menu__container .plyr__control[role='menuitemradio']::before { border-radius: 100%; } -.plyr__menu__container .plyr__control[role="menuitemradio"]::before { +.plyr__menu__container .plyr__control[role='menuitemradio']::before { background: rgba(0, 0, 0, 0.1); - content: ""; + content: ''; display: block; flex-shrink: 0; height: 16px; @@ -479,7 +479,7 @@ a.plyr__control::before { width: 16px; } -.plyr__menu__container .plyr__control[role="menuitemradio"]::after { +.plyr__menu__container .plyr__control[role='menuitemradio']::after { background: #fff; border: 0; height: 6px; @@ -492,7 +492,7 @@ a.plyr__control::before { } .plyr__menu__container - .plyr__control[role="menuitemradio"][aria-checked="true"]::before { + .plyr__control[role='menuitemradio'][aria-checked='true']::before { background: #00b3ff; background: var( --plyr-control-toggle-checked-background, @@ -501,14 +501,14 @@ a.plyr__control::before { } .plyr__menu__container - .plyr__control[role="menuitemradio"][aria-checked="true"]::after { + .plyr__control[role='menuitemradio'][aria-checked='true']::after { opacity: 1; transform: translateY(-50%) scale(1); } .plyr__menu__container - .plyr__control[role="menuitemradio"].plyr__tab-focus::before, -.plyr__menu__container .plyr__control[role="menuitemradio"]:hover::before { + .plyr__control[role='menuitemradio'].plyr__tab-focus::before, +.plyr__menu__container .plyr__control[role='menuitemradio']:hover::before { background: rgba(35, 40, 47, 0.1); } @@ -524,7 +524,7 @@ a.plyr__control::before { pointer-events: none; } -.plyr--full-ui input[type="range"] { +.plyr--full-ui input[type='range'] { -webkit-appearance: none; background: 0 0; border: 0; @@ -547,7 +547,7 @@ a.plyr__control::before { width: 100%; } -.plyr--full-ui input[type="range"]::-webkit-slider-runnable-track { +.plyr--full-ui input[type='range']::-webkit-slider-runnable-track { background: 0 0; border: 0; border-radius: calc(5px / 2); @@ -566,7 +566,7 @@ a.plyr__control::before { ); } -.plyr--full-ui input[type="range"]::-webkit-slider-thumb { +.plyr--full-ui input[type='range']::-webkit-slider-thumb { background: #fff; background: var(--plyr-range-thumb-background, #fff); border: 0; @@ -596,7 +596,7 @@ a.plyr__control::before { ); } -.plyr--full-ui input[type="range"]::-moz-range-track { +.plyr--full-ui input[type='range']::-moz-range-track { background: 0 0; border: 0; border-radius: calc(5px / 2); @@ -608,7 +608,7 @@ a.plyr__control::before { user-select: none; } -.plyr--full-ui input[type="range"]::-moz-range-thumb { +.plyr--full-ui input[type='range']::-moz-range-thumb { background: #fff; background: var(--plyr-range-thumb-background, #fff); border: 0; @@ -628,7 +628,7 @@ a.plyr__control::before { width: var(--plyr-range-thumb-height, 13px); } -.plyr--full-ui input[type="range"]::-moz-range-progress { +.plyr--full-ui input[type='range']::-moz-range-progress { background: currentColor; border-radius: calc(5px / 2); border-radius: calc(var(--plyr-range-track-height, 5px) / 2); @@ -636,7 +636,7 @@ a.plyr__control::before { height: var(--plyr-range-track-height, 5px); } -.plyr--full-ui input[type="range"]::-ms-track { +.plyr--full-ui input[type='range']::-ms-track { background: 0 0; border: 0; border-radius: calc(5px / 2); @@ -650,7 +650,7 @@ a.plyr__control::before { color: transparent; } -.plyr--full-ui input[type="range"]::-ms-fill-upper { +.plyr--full-ui input[type='range']::-ms-fill-upper { background: 0 0; border: 0; border-radius: calc(5px / 2); @@ -663,7 +663,7 @@ a.plyr__control::before { user-select: none; } -.plyr--full-ui input[type="range"]::-ms-fill-lower { +.plyr--full-ui input[type='range']::-ms-fill-lower { background: 0 0; border: 0; border-radius: calc(5px / 2); @@ -677,7 +677,7 @@ a.plyr__control::before { background: currentColor; } -.plyr--full-ui input[type="range"]::-ms-thumb { +.plyr--full-ui input[type='range']::-ms-thumb { background: #fff; background: var(--plyr-range-thumb-background, #fff); border: 0; @@ -698,20 +698,20 @@ a.plyr__control::before { margin-top: 0; } -.plyr--full-ui input[type="range"]::-ms-tooltip { +.plyr--full-ui input[type='range']::-ms-tooltip { display: none; } -.plyr--full-ui input[type="range"]:focus { +.plyr--full-ui input[type='range']:focus { outline: 0; } -.plyr--full-ui input[type="range"]::-moz-focus-outer { +.plyr--full-ui input[type='range']::-moz-focus-outer { border: 0; } .plyr--full-ui - input[type="range"].plyr__tab-focus::-webkit-slider-runnable-track { + input[type='range'].plyr__tab-focus::-webkit-slider-runnable-track { outline-color: #00b3ff; outline-color: var( --plyr-tab-focus-color, @@ -722,7 +722,7 @@ a.plyr__control::before { outline-width: 3px; } -.plyr--full-ui input[type="range"].plyr__tab-focus::-moz-range-track { +.plyr--full-ui input[type='range'].plyr__tab-focus::-moz-range-track { outline-color: #00b3ff; outline-color: var( --plyr-tab-focus-color, @@ -733,7 +733,7 @@ a.plyr__control::before { outline-width: 3px; } -.plyr--full-ui input[type="range"].plyr__tab-focus::-ms-track { +.plyr--full-ui input[type='range'].plyr__tab-focus::-ms-track { outline-color: #00b3ff; outline-color: var( --plyr-tab-focus-color, @@ -769,7 +769,7 @@ a.plyr__control::before { } .plyr__time + .plyr__time::before { - content: "\2044"; + content: '\2044'; margin-right: 10px; margin-right: var(--plyr-control-spacing, 10px); } @@ -821,7 +821,7 @@ a.plyr__control::before { var(--plyr-tooltip-background, rgba(255, 255, 255, 0.9)); bottom: calc(4px * -1); bottom: calc(var(--plyr-tooltip-arrow-size, 4px) * -1); - content: ""; + content: ''; height: 0; left: 50%; position: absolute; @@ -906,7 +906,7 @@ a.plyr__control::before { position: relative; } -.plyr__progress input[type="range"], +.plyr__progress input[type='range'], .plyr__progress__buffer { margin-left: calc(13px * -0.5); margin-left: calc(var(--plyr-range-thumb-height, 13px) * -0.5); @@ -916,7 +916,7 @@ a.plyr__control::before { width: calc(100% + var(--plyr-range-thumb-height, 13px)); } -.plyr__progress input[type="range"] { +.plyr__progress input[type='range'] { position: relative; z-index: 2; } @@ -1024,7 +1024,7 @@ a.plyr__control::before { width: 20%; } -.plyr__volume input[type="range"] { +.plyr__volume input[type='range'] { margin-left: calc(10px / 2); margin-left: calc(var(--plyr-control-spacing, 10px) / 2); margin-right: calc(10px / 2); @@ -1054,7 +1054,7 @@ a.plyr__control::before { .plyr--audio .plyr__control.plyr__tab-focus, .plyr--audio .plyr__control:hover, -.plyr--audio .plyr__control[aria-expanded="true"] { +.plyr--audio .plyr__control[aria-expanded='true'] { background: #00b3ff; background: var( --plyr-audio-control-background-hover, @@ -1064,7 +1064,7 @@ a.plyr__control::before { color: var(--plyr-audio-control-color-hover, #fff); } -.plyr--full-ui.plyr--audio input[type="range"]::-webkit-slider-runnable-track { +.plyr--full-ui.plyr--audio input[type='range']::-webkit-slider-runnable-track { background-color: rgba(193, 200, 209, 0.6); background-color: var( --plyr-audio-range-track-background, @@ -1072,7 +1072,7 @@ a.plyr__control::before { ); } -.plyr--full-ui.plyr--audio input[type="range"]::-moz-range-track { +.plyr--full-ui.plyr--audio input[type='range']::-moz-range-track { background-color: rgba(193, 200, 209, 0.6); background-color: var( --plyr-audio-range-track-background, @@ -1080,7 +1080,7 @@ a.plyr__control::before { ); } -.plyr--full-ui.plyr--audio input[type="range"]::-ms-track { +.plyr--full-ui.plyr--audio input[type='range']::-ms-track { background-color: rgba(193, 200, 209, 0.6); background-color: var( --plyr-audio-range-track-background, @@ -1088,7 +1088,7 @@ a.plyr__control::before { ); } -.plyr--full-ui.plyr--audio input[type="range"]:active::-webkit-slider-thumb { +.plyr--full-ui.plyr--audio input[type='range']:active::-webkit-slider-thumb { box-shadow: 0 1px 1px rgba(35, 40, 47, 0.15), 0 0 0 1px rgba(35, 40, 47, 0.2), 0 0 0 3px rgba(35, 40, 47, 0.1); box-shadow: var( @@ -1100,7 +1100,7 @@ a.plyr__control::before { var(--plyr-audio-range-thumb-active-shadow-color, rgba(35, 40, 47, 0.1)); } -.plyr--full-ui.plyr--audio input[type="range"]:active::-moz-range-thumb { +.plyr--full-ui.plyr--audio input[type='range']:active::-moz-range-thumb { box-shadow: 0 1px 1px rgba(35, 40, 47, 0.15), 0 0 0 1px rgba(35, 40, 47, 0.2), 0 0 0 3px rgba(35, 40, 47, 0.1); box-shadow: var( @@ -1112,7 +1112,7 @@ a.plyr__control::before { var(--plyr-audio-range-thumb-active-shadow-color, rgba(35, 40, 47, 0.1)); } -.plyr--full-ui.plyr--audio input[type="range"]:active::-ms-thumb { +.plyr--full-ui.plyr--audio input[type='range']:active::-ms-thumb { box-shadow: 0 1px 1px rgba(35, 40, 47, 0.15), 0 0 0 1px rgba(35, 40, 47, 0.2), 0 0 0 3px rgba(35, 40, 47, 0.1); box-shadow: var( @@ -1207,7 +1207,7 @@ a.plyr__control::before { .plyr--video .plyr__control.plyr__tab-focus, .plyr--video .plyr__control:hover, -.plyr--video .plyr__control[aria-expanded="true"] { +.plyr--video .plyr__control[aria-expanded='true'] { background: #00b3ff; background: var( --plyr-video-control-background-hover, @@ -1258,7 +1258,7 @@ a.plyr__control::before { display: block; } -.plyr--full-ui.plyr--video input[type="range"]::-webkit-slider-runnable-track { +.plyr--full-ui.plyr--video input[type='range']::-webkit-slider-runnable-track { background-color: rgba(255, 255, 255, 0.25); background-color: var( --plyr-video-range-track-background, @@ -1266,7 +1266,7 @@ a.plyr__control::before { ); } -.plyr--full-ui.plyr--video input[type="range"]::-moz-range-track { +.plyr--full-ui.plyr--video input[type='range']::-moz-range-track { background-color: rgba(255, 255, 255, 0.25); background-color: var( --plyr-video-range-track-background, @@ -1274,7 +1274,7 @@ a.plyr__control::before { ); } -.plyr--full-ui.plyr--video input[type="range"]::-ms-track { +.plyr--full-ui.plyr--video input[type='range']::-ms-track { background-color: rgba(255, 255, 255, 0.25); background-color: var( --plyr-video-range-track-background, @@ -1282,7 +1282,7 @@ a.plyr__control::before { ); } -.plyr--full-ui.plyr--video input[type="range"]:active::-webkit-slider-thumb { +.plyr--full-ui.plyr--video input[type='range']:active::-webkit-slider-thumb { box-shadow: 0 1px 1px rgba(35, 40, 47, 0.15), 0 0 0 1px rgba(35, 40, 47, 0.2), 0 0 0 3px rgba(255, 255, 255, 0.5); box-shadow: var( @@ -1297,7 +1297,7 @@ a.plyr__control::before { ); } -.plyr--full-ui.plyr--video input[type="range"]:active::-moz-range-thumb { +.plyr--full-ui.plyr--video input[type='range']:active::-moz-range-thumb { box-shadow: 0 1px 1px rgba(35, 40, 47, 0.15), 0 0 0 1px rgba(35, 40, 47, 0.2), 0 0 0 3px rgba(255, 255, 255, 0.5); box-shadow: var( @@ -1312,7 +1312,7 @@ a.plyr__control::before { ); } -.plyr--full-ui.plyr--video input[type="range"]:active::-ms-thumb { +.plyr--full-ui.plyr--video input[type='range']:active::-ms-thumb { box-shadow: 0 1px 1px rgba(35, 40, 47, 0.15), 0 0 0 1px rgba(35, 40, 47, 0.2), 0 0 0 3px rgba(255, 255, 255, 0.5); box-shadow: var( @@ -1713,7 +1713,7 @@ a.plyr__control::before { var(--plyr-tooltip-background, rgba(255, 255, 255, 0.9)); bottom: calc(4px * -1); bottom: calc(var(--plyr-tooltip-arrow-size, 4px) * -1); - content: ""; + content: ''; height: 0; left: 50%; position: absolute; diff --git a/src/assets/css/slider.css b/src/assets/css/slider.css index 706c79e..071210b 100644 --- a/src/assets/css/slider.css +++ b/src/assets/css/slider.css @@ -89,7 +89,7 @@ } .nyancat .vue-slider-dot-handle { - background: url("/img/logos/nyancat.gif"); + background: url('/img/logos/nyancat.gif'); background-size: 36px; width: 36px; height: 24px; @@ -99,3 +99,46 @@ box-sizing: border-box; visibility: visible; } + +.nyancat-stop .vue-slider-dot-handle { + background-image: url('/img/logos/nyancat-stop.png'); + transition: 300ms; +} + +/* lyrics */ +.lyrics-page .vue-slider-rail { + background-color: rgba(128, 128, 128, 0.18); + border-radius: 2px; + height: 4px; + opacity: 0.88; +} + +.lyrics-page .vue-slider-process { + background-color: #060606; +} + +.lyrics-page .vue-slider-dot-handle { + background-color: #060606; + box-shadow: unset; +} + +.lyrics-page .vue-slider-dot-tooltip { + display: none; +} + +body[data-theme='dark'] .lyrics-page .vue-slider-process { + background-color: #fafafa; +} + +body[data-theme='dark'] .lyrics-page .vue-slider-dot-handle { + background-color: #fff; +} + +.lyrics-page[data-theme='dark'] .vue-slider-rail { + background-color: rgba(255, 255, 255, 0.18); +} + +.lyrics-page[data-theme='dark'] .vue-slider-process, +.lyrics-page[data-theme='dark'] .vue-slider-dot-handle { + background-color: #fff; +} diff --git a/src/assets/fonts/Barlow-Black.ttf b/src/assets/fonts/Barlow-Black.ttf new file mode 100755 index 0000000..c4a4b05 Binary files /dev/null and b/src/assets/fonts/Barlow-Black.ttf differ diff --git a/src/assets/fonts/Barlow-Black.woff2 b/src/assets/fonts/Barlow-Black.woff2 new file mode 100644 index 0000000..b3b05b0 Binary files /dev/null and b/src/assets/fonts/Barlow-Black.woff2 differ diff --git a/src/assets/fonts/Barlow-Bold.ttf b/src/assets/fonts/Barlow-Bold.ttf new file mode 100755 index 0000000..cf78fd4 Binary files /dev/null and b/src/assets/fonts/Barlow-Bold.ttf differ diff --git a/src/assets/fonts/Barlow-Bold.woff2 b/src/assets/fonts/Barlow-Bold.woff2 new file mode 100644 index 0000000..1e3542c Binary files /dev/null and b/src/assets/fonts/Barlow-Bold.woff2 differ diff --git a/src/assets/fonts/Barlow-ExtraBold.ttf b/src/assets/fonts/Barlow-ExtraBold.ttf new file mode 100755 index 0000000..3d5f061 Binary files /dev/null and b/src/assets/fonts/Barlow-ExtraBold.ttf differ diff --git a/src/assets/fonts/Barlow-ExtraBold.woff2 b/src/assets/fonts/Barlow-ExtraBold.woff2 new file mode 100644 index 0000000..d5789b2 Binary files /dev/null and b/src/assets/fonts/Barlow-ExtraBold.woff2 differ diff --git a/src/assets/fonts/Barlow-Medium.ttf b/src/assets/fonts/Barlow-Medium.ttf new file mode 100755 index 0000000..1ed9192 Binary files /dev/null and b/src/assets/fonts/Barlow-Medium.ttf differ diff --git a/src/assets/fonts/Barlow-Medium.woff2 b/src/assets/fonts/Barlow-Medium.woff2 new file mode 100644 index 0000000..93e9bcb Binary files /dev/null and b/src/assets/fonts/Barlow-Medium.woff2 differ diff --git a/src/assets/fonts/Barlow-Regular.ttf b/src/assets/fonts/Barlow-Regular.ttf new file mode 100755 index 0000000..8bc6a2e Binary files /dev/null and b/src/assets/fonts/Barlow-Regular.ttf differ diff --git a/src/assets/fonts/Barlow-Regular.woff2 b/src/assets/fonts/Barlow-Regular.woff2 new file mode 100644 index 0000000..65b4987 Binary files /dev/null and b/src/assets/fonts/Barlow-Regular.woff2 differ diff --git a/src/assets/fonts/Barlow-SemiBold.ttf b/src/assets/fonts/Barlow-SemiBold.ttf new file mode 100755 index 0000000..7b7320b Binary files /dev/null and b/src/assets/fonts/Barlow-SemiBold.ttf differ diff --git a/src/assets/fonts/Barlow-SemiBold.woff2 b/src/assets/fonts/Barlow-SemiBold.woff2 new file mode 100644 index 0000000..3f582a0 Binary files /dev/null and b/src/assets/fonts/Barlow-SemiBold.woff2 differ diff --git a/src/assets/icons/arrow-down.svg b/src/assets/icons/arrow-down.svg new file mode 100644 index 0000000..333ce72 --- /dev/null +++ b/src/assets/icons/arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/arrow-up-alt.svg b/src/assets/icons/arrow-up-alt.svg new file mode 100644 index 0000000..1980837 --- /dev/null +++ b/src/assets/icons/arrow-up-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/arrow-up.svg b/src/assets/icons/arrow-up.svg new file mode 100644 index 0000000..bc5a0bd --- /dev/null +++ b/src/assets/icons/arrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/circle.svg b/src/assets/icons/circle.svg deleted file mode 100644 index eb210da..0000000 --- a/src/assets/icons/circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/icons/dropdown.svg b/src/assets/icons/dropdown.svg new file mode 100644 index 0000000..e1d0723 --- /dev/null +++ b/src/assets/icons/dropdown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/expand.svg b/src/assets/icons/expand.svg deleted file mode 100644 index 41efe24..0000000 --- a/src/assets/icons/expand.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/icons/fm.svg b/src/assets/icons/fm.svg new file mode 100644 index 0000000..fe760cd --- /dev/null +++ b/src/assets/icons/fm.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/fullscreen-exit.svg b/src/assets/icons/fullscreen-exit.svg new file mode 100644 index 0000000..f76f601 --- /dev/null +++ b/src/assets/icons/fullscreen-exit.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/fullscreen.svg b/src/assets/icons/fullscreen.svg new file mode 100644 index 0000000..e6128c0 --- /dev/null +++ b/src/assets/icons/fullscreen.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/index.js b/src/assets/icons/index.js index 70c0243..ee45a56 100644 --- a/src/assets/icons/index.js +++ b/src/assets/icons/index.js @@ -1,8 +1,7 @@ -import Vue from "vue"; -import SvgIcon from "@/components/SvgIcon"; +import Vue from 'vue'; +import SvgIcon from '@/components/SvgIcon'; -Vue.component("svg-icon", SvgIcon); -const requireAll = (requireContext) => - requireContext.keys().map(requireContext); -const req = require.context("./", true, /\.svg$/); +Vue.component('svg-icon', SvgIcon); +const requireAll = requireContext => requireContext.keys().map(requireContext); +const req = require.context('./', true, /\.svg$/); requireAll(req); diff --git a/src/assets/icons/login.svg b/src/assets/icons/login.svg new file mode 100644 index 0000000..b4acd61 --- /dev/null +++ b/src/assets/icons/login.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/more.svg b/src/assets/icons/more.svg index 53c45a1..51bb992 100644 --- a/src/assets/icons/more.svg +++ b/src/assets/icons/more.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/icons/plus.svg b/src/assets/icons/plus.svg new file mode 100644 index 0000000..e254d52 --- /dev/null +++ b/src/assets/icons/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/sort-up.svg b/src/assets/icons/sort-up.svg new file mode 100644 index 0000000..3efe4cf --- /dev/null +++ b/src/assets/icons/sort-up.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/assets/icons/thumbs-down.svg b/src/assets/icons/thumbs-down.svg new file mode 100644 index 0000000..02fe63b --- /dev/null +++ b/src/assets/icons/thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/translation.svg b/src/assets/icons/translation.svg deleted file mode 100644 index 9cbd770..0000000 --- a/src/assets/icons/translation.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/background.js b/src/background.js index 2cfa7c5..94dbbc0 100644 --- a/src/background.js +++ b/src/background.js @@ -1,140 +1,489 @@ -"use strict"; -import { app, protocol, BrowserWindow, shell } from "electron"; -import { createProtocol } from "vue-cli-plugin-electron-builder/lib"; -import installExtension, { VUEJS_DEVTOOLS } from "electron-devtools-installer"; -import { startNeteaseMusicApi } from "./electron/services"; -import { initIpcMain } from "./electron/ipcMain.js"; -import { createMenu } from "./electron/menu"; -import { createTouchBar } from "./electron/touchBar"; -import { createDockMenu } from "./electron/dockMenu"; -import { createTray } from "./electron/tray.js"; -import { autoUpdater } from "electron-updater"; -import express from "express"; +'use strict'; +import { + app, + protocol, + BrowserWindow, + shell, + dialog, + globalShortcut, + nativeTheme, + screen, +} from 'electron'; +import { + isWindows, + isMac, + isLinux, + isDevelopment, + isCreateTray, + isCreateMpris, +} from '@/utils/platform'; +import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'; +import { startNeteaseMusicApi } from './electron/services'; +import { initIpcMain } from './electron/ipcMain.js'; +import { createMenu } from './electron/menu'; +import { createTray } from '@/electron/tray'; +import { createTouchBar } from './electron/touchBar'; +import { createDockMenu } from './electron/dockMenu'; +import { registerGlobalShortcut } from './electron/globalShortcut'; +import { autoUpdater } from 'electron-updater'; +import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'; +import { EventEmitter } from 'events'; +import express from 'express'; +import expressProxy from 'express-http-proxy'; +import Store from 'electron-store'; +import { createMpris, createDbus } from '@/electron/mpris'; +import { spawn } from 'child_process'; +const clc = require('cli-color'); +const log = text => { + console.log(`${clc.blueBright('[background.js]')} ${text}`); +}; -const isDevelopment = process.env.NODE_ENV !== "production"; - -// Keep a global reference of the window object, if you don't, the window will -// be closed automatically when the JavaScript object is garbage collected. -let win; - -// ipcMain -initIpcMain(win); - -// check for update -autoUpdater.checkForUpdatesAndNotify(); - -// Scheme must be registered before the app is ready -protocol.registerSchemesAsPrivileged([ - { scheme: "app", privileges: { secure: true, standard: true } }, -]); - -function createWindow() { - win = new BrowserWindow({ - width: 1440, - height: 840, - titleBarStyle: "hiddenInset", - webPreferences: { - webSecurity: false, - nodeIntegration: true, - }, - }); - win.setMenuBarVisibility(false); - - if (process.platform !== "darwin") { - createTray(win); - } - - if (process.env.WEBPACK_DEV_SERVER_URL) { - // Load the url of the dev server if in development mode - win.loadURL(process.env.WEBPACK_DEV_SERVER_URL); - if (!process.env.IS_TEST) win.webContents.openDevTools(); - } else { - createProtocol("app"); - // win.loadURL("app://./index.html"); - const expressApp = express(); - expressApp.use("/", express.static(__dirname + "/")); - expressApp.listen(27232); - win.loadURL("http://localhost:27232"); - } - - win.webContents.on("new-window", function (e, url) { +const closeOnLinux = (e, win, store) => { + let closeOpt = store.get('settings.closeAppOption'); + if (closeOpt !== 'exit') { e.preventDefault(); - shell.openExternal(url); - }); - win.on("closed", () => { + } + + if (closeOpt === 'ask') { + dialog + .showMessageBox({ + type: 'info', + title: 'Information', + cancelId: 2, + defaultId: 0, + message: '确定要关闭吗?', + buttons: ['最小化到托盘', '直接退出'], + checkboxLabel: '记住我的选择', + }) + .then(result => { + if (result.checkboxChecked && result.response !== 2) { + win.webContents.send( + 'rememberCloseAppOption', + result.response === 0 ? 'minimizeToTray' : 'exit' + ); + } + + if (result.response === 0) { + win.hide(); //调用 最小化实例方法 + } else if (result.response === 1) { + win = null; + app.exit(); //exit()直接关闭客户端,不会执行quit(); + } + }) + .catch(err => { + log(err); + }); + } else if (closeOpt === 'exit') { win = null; - }); - return win; -} - -// Quit when all windows are closed. -app.on("window-all-closed", () => { - // On macOS it is common for applications and their menu bar - // to stay active until the user quits explicitly with Cmd + Q - if (process.platform !== "darwin") { app.quit(); + } else { + win.hide(); } -}); +}; -app.on("activate", () => { - // On macOS it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (win === null) { - createWindow(); +class Background { + constructor() { + this.window = null; + this.ypmTrayImpl = null; + this.store = new Store({ + windowWidth: { + width: { type: 'number', default: 1440 }, + height: { type: 'number', default: 840 }, + }, + }); + this.neteaseMusicAPI = null; + this.expressApp = null; + this.willQuitApp = !isMac; + + this.init(); } -}); -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. -app.on("ready", async () => { - // start netease music api - startNeteaseMusicApi(); + init() { + log('initializing'); - // Install Vue Devtools extension - if (isDevelopment && !process.env.IS_TEST) { - try { - await installExtension(VUEJS_DEVTOOLS); - } catch (e) { - console.error("Vue Devtools failed to install:", e.toString()); + // Make sure the app is singleton. + if (!app.requestSingleInstanceLock()) return app.quit(); + + // start netease music api + this.neteaseMusicAPI = startNeteaseMusicApi(); + + // create Express app + this.createExpressApp(); + + // Scheme must be registered before the app is ready + protocol.registerSchemesAsPrivileged([ + { scheme: 'app', privileges: { secure: true, standard: true } }, + ]); + + // handle app events + this.handleAppEvents(); + + // disable chromium mpris + if (isCreateMpris) { + app.commandLine.appendSwitch( + 'disable-features', + 'HardwareMediaKeyHandling,MediaSessionService' + ); } } - // create window - createWindow(); - win.once("ready-to-show", () => { - win.show(); - }); + async initDevtools() { + // Install Vue Devtools extension + try { + await installExtension(VUEJS_DEVTOOLS); + } catch (e) { + console.error('Vue Devtools failed to install:', e.toString()); + } - // create menu - createMenu(win); + // Exit cleanly on request from parent process in development mode. + if (isWindows) { + process.on('message', data => { + if (data === 'graceful-exit') { + app.quit(); + } + }); + } else { + process.on('SIGTERM', () => { + app.quit(); + }); + } + } - // create dock menu for macOS - app.dock.setMenu(createDockMenu(win)); + createExpressApp() { + log('creating express app'); - // create touchbar - win.setTouchBar(createTouchBar(win)); -}); + const expressApp = express(); + expressApp.use('/', express.static(__dirname + '/')); + expressApp.use('/api', expressProxy('http://127.0.0.1:10754')); + expressApp.use('/player', (req, res) => { + this.window.webContents + .executeJavaScript('window.yesplaymusic.player') + .then(result => { + res.send({ + currentTrack: result._isPersonalFM + ? result._personalFMTrack + : result._currentTrack, + progress: result._progress, + }); + }); + }); + this.expressApp = expressApp.listen(27232, '127.0.0.1'); + } -// Exit cleanly on request from parent process in development mode. -if (isDevelopment) { - if (process.platform === "win32") { - process.on("message", (data) => { - if (data === "graceful-exit") { + createWindow() { + log('creating app window'); + + const appearance = this.store.get('settings.appearance'); + const showLibraryDefault = this.store.get('settings.showLibraryDefault'); + + const options = { + width: this.store.get('window.width') || 1440, + height: this.store.get('window.height') || 840, + minWidth: 1080, + minHeight: 720, + titleBarStyle: 'hiddenInset', + frame: !( + isWindows || + (isLinux && this.store.get('settings.linuxEnableCustomTitlebar')) + ), + title: 'YesPlayMusic', + show: false, + webPreferences: { + webSecurity: false, + nodeIntegration: true, + enableRemoteModule: true, + contextIsolation: false, + }, + backgroundColor: + ((appearance === undefined || appearance === 'auto') && + nativeTheme.shouldUseDarkColors) || + appearance === 'dark' + ? '#222' + : '#fff', + }; + + if (this.store.get('window.x') && this.store.get('window.y')) { + let x = this.store.get('window.x'); + let y = this.store.get('window.y'); + + let displays = screen.getAllDisplays(); + let isResetWindiw = false; + if (displays.length === 1) { + let { bounds } = displays[0]; + if ( + x < bounds.x || + x > bounds.x + bounds.width - 50 || + y < bounds.y || + y > bounds.y + bounds.height - 50 + ) { + isResetWindiw = true; + } + } else { + isResetWindiw = true; + for (let i = 0; i < displays.length; i++) { + let { bounds } = displays[i]; + if ( + x > bounds.x && + x < bounds.x + bounds.width && + y > bounds.y && + y < bounds.y - bounds.height + ) { + // 检测到APP窗口当前处于一个可用的屏幕里,break + isResetWindiw = false; + break; + } + } + } + + if (!isResetWindiw) { + options.x = x; + options.y = y; + } + } + + this.window = new BrowserWindow(options); + + // hide menu bar on Microsoft Windows and Linux + this.window.setMenuBarVisibility(false); + + if (process.env.WEBPACK_DEV_SERVER_URL) { + // Load the url of the dev server if in development mode + this.window.loadURL( + showLibraryDefault + ? `${process.env.WEBPACK_DEV_SERVER_URL}/#/library` + : process.env.WEBPACK_DEV_SERVER_URL + ); + if (!process.env.IS_TEST) this.window.webContents.openDevTools(); + } else { + createProtocol('app'); + this.window.loadURL( + showLibraryDefault + ? 'http://localhost:27232/#/library' + : 'http://localhost:27232' + ); + } + } + + checkForUpdates() { + if (isDevelopment) return; + log('checkForUpdates'); + autoUpdater.checkForUpdatesAndNotify(); + + const showNewVersionMessage = info => { + dialog + .showMessageBox({ + title: '发现新版本 v' + info.version, + message: '发现新版本 v' + info.version, + detail: '是否前往 GitHub 下载新版本安装包?', + buttons: ['下载', '取消'], + type: 'question', + noLink: true, + }) + .then(result => { + if (result.response === 0) { + shell.openExternal( + 'https://github.com/qier222/YesPlayMusic/releases' + ); + } + }); + }; + + autoUpdater.on('update-available', info => { + showNewVersionMessage(info); + }); + } + + handleWindowEvents() { + this.window.once('ready-to-show', () => { + log('window ready-to-show event'); + this.window.show(); + this.store.set('window', this.window.getBounds()); + }); + + this.window.on('close', e => { + log('window close event'); + + if (isLinux) { + closeOnLinux(e, this.window, this.store); + } else if (isMac) { + if (this.willQuitApp) { + this.window = null; + app.quit(); + } else { + e.preventDefault(); + this.window.hide(); + } + } else { + let closeOpt = this.store.get('settings.closeAppOption'); + if (this.willQuitApp && (closeOpt === 'exit' || closeOpt === 'ask')) { + this.window = null; + app.quit(); + } else { + e.preventDefault(); + this.window.hide(); + } + } + }); + + this.window.on('resized', () => { + this.store.set('window', this.window.getBounds()); + }); + + this.window.on('moved', () => { + this.store.set('window', this.window.getBounds()); + }); + + this.window.on('maximize', () => { + this.window.webContents.send('isMaximized', true); + }); + + this.window.on('unmaximize', () => { + this.window.webContents.send('isMaximized', false); + }); + + this.window.webContents.on('new-window', function (e, url) { + e.preventDefault(); + log('open url'); + const excludeHosts = ['www.last.fm']; + const exclude = excludeHosts.find(host => url.includes(host)); + if (exclude) { + const newWindow = new BrowserWindow({ + width: 800, + height: 600, + titleBarStyle: 'default', + title: 'YesPlayMusic', + webPreferences: { + webSecurity: false, + nodeIntegration: true, + enableRemoteModule: true, + contextIsolation: false, + }, + }); + newWindow.loadURL(url); + return; + } + shell.openExternal(url); + }); + } + + handleAppEvents() { + app.on('ready', async () => { + // This method will be called when Electron has finished + // initialization and is ready to create browser windows. + // Some APIs can only be used after this event occurs. + log('app ready event'); + + // for development + if (isDevelopment) { + this.initDevtools(); + } + + // create window + this.createWindow(); + this.window.once('ready-to-show', () => { + this.window.show(); + }); + this.handleWindowEvents(); + + // create tray + if (isCreateTray) { + this.trayEventEmitter = new EventEmitter(); + this.ypmTrayImpl = createTray(this.window, this.trayEventEmitter); + } + + // init ipcMain + initIpcMain(this.window, this.store, this.trayEventEmitter); + + // set proxy + const proxyRules = this.store.get('proxy'); + if (proxyRules) { + this.window.webContents.session.setProxy({ proxyRules }, result => { + log('finished setProxy', result); + }); + } + + // check for updates + this.checkForUpdates(); + + // create menu + createMenu(this.window, this.store); + + // create dock menu for macOS + const createdDockMenu = createDockMenu(this.window); + if (createDockMenu && app.dock) app.dock.setMenu(createdDockMenu); + + // create touch bar + const createdTouchBar = createTouchBar(this.window); + if (createdTouchBar) this.window.setTouchBar(createdTouchBar); + + // register global shortcuts + if (this.store.get('settings.enableGlobalShortcut') !== false) { + registerGlobalShortcut(this.window, this.store); + } + + // try to start osdlyrics process on start + if (this.store.get('settings.enableOsdlyricsSupport')) { + await createDbus(this.window); + log('try to start osdlyrics process'); + const osdlyricsProcess = spawn('osdlyrics'); + + osdlyricsProcess.on('error', err => { + log(`failed to start osdlyrics: ${err.message}`); + }); + + osdlyricsProcess.on('exit', (code, signal) => { + log(`osdlyrics process exited with code ${code}, signal ${signal}`); + }); + } + + // create mpris + if (isCreateMpris) { + createMpris(this.window); + } + }); + + app.on('activate', () => { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + log('app activate event'); + if (this.window === null) { + this.createWindow(); + } else { + this.window.show(); + } + }); + + app.on('window-all-closed', () => { + if (!isMac) { app.quit(); } }); - } else { - process.on("SIGTERM", () => { - app.quit(); + + app.on('before-quit', () => { + this.willQuitApp = true; }); + + app.on('quit', () => { + this.expressApp.close(); + }); + + app.on('will-quit', () => { + // unregister all global shortcuts + globalShortcut.unregisterAll(); + }); + + if (!isMac) { + app.on('second-instance', (e, cl, wd) => { + if (this.window) { + this.window.show(); + if (this.window.isMinimized()) { + this.window.restore(); + } + this.window.focus(); + } + }); + } } } -// Make sure the app is singleton. -function initialize() { - const shouldQuit = !app.requestSingleInstanceLock(); - if (shouldQuit) return app.quit(); -} - -initialize(); +new Background(); diff --git a/src/components/ArtistsInLine.vue b/src/components/ArtistsInLine.vue index b834f47..e2c619d 100644 --- a/src/components/ArtistsInLine.vue +++ b/src/components/ArtistsInLine.vue @@ -1,16 +1,21 @@ - + diff --git a/src/components/ButtonIcon.vue b/src/components/ButtonIcon.vue index 12d6af6..d6afee3 100644 --- a/src/components/ButtonIcon.vue +++ b/src/components/ButtonIcon.vue @@ -4,7 +4,7 @@ @@ -27,7 +27,7 @@ button { margin-left: 0; } &:hover { - background: var(--color-secondary-bg); + background: var(--color-secondary-bg-for-transparent); } &:active { transform: scale(0.92); diff --git a/src/components/ButtonTwoTone.vue b/src/components/ButtonTwoTone.vue index d2cde2b..c72739a 100644 --- a/src/components/ButtonTwoTone.vue +++ b/src/components/ButtonTwoTone.vue @@ -2,7 +2,7 @@