Compare commits
No commits in common. '6d8850520470f6196eb83710b1e841f6f7d55df8' and 'd13c1129dec7c62db0fb2041a4fd06b10dba93a6' have entirely different histories.
6d88505204
...
d13c1129de
@ -1,16 +0,0 @@
|
|||||||
node_modules
|
|
||||||
npm-debug.log
|
|
||||||
Dockerfile*
|
|
||||||
docker-compose*
|
|
||||||
.dockerignore
|
|
||||||
.git
|
|
||||||
.github
|
|
||||||
.gitignore
|
|
||||||
README.md
|
|
||||||
LICENSE
|
|
||||||
.vscode
|
|
||||||
dist
|
|
||||||
dist_electron
|
|
||||||
build
|
|
||||||
images
|
|
||||||
script
|
|
@ -1,8 +0,0 @@
|
|||||||
root = true
|
|
||||||
|
|
||||||
[*]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
||||||
charset = utf-8
|
|
||||||
trim_trailing_whitespace = false
|
|
||||||
insert_final_newline = false
|
|
@ -1,7 +0,0 @@
|
|||||||
* 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
|
|
@ -1,116 +0,0 @@
|
|||||||
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-18.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 bsdtar &&
|
|
||||||
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_ELECTRON_API_URL: /api
|
|
||||||
VUE_APP_ELECTRON_API_URL_DEV: /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
|
|
@ -1,34 +0,0 @@
|
|||||||
.DS_Store
|
|
||||||
node_modules
|
|
||||||
/dist
|
|
||||||
|
|
||||||
# local env files
|
|
||||||
.env
|
|
||||||
.env.local
|
|
||||||
.env.*.local
|
|
||||||
|
|
||||||
# Log files
|
|
||||||
npm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
pnpm-debug.log*
|
|
||||||
|
|
||||||
# Editor directories and files
|
|
||||||
.idea
|
|
||||||
.vscode
|
|
||||||
*.suo
|
|
||||||
*.ntvs*
|
|
||||||
*.njsproj
|
|
||||||
*.sln
|
|
||||||
*.sw?
|
|
||||||
|
|
||||||
.vercel
|
|
||||||
|
|
||||||
#Electron-builder output
|
|
||||||
/dist_electron
|
|
||||||
NeteaseCloudMusicApi-master
|
|
||||||
NeteaseCloudMusicApi-master.zip
|
|
||||||
|
|
||||||
# Local Netlify folder
|
|
||||||
.netlify
|
|
||||||
vercel.json
|
|
@ -1,3 +0,0 @@
|
|||||||
build
|
|
||||||
coverage
|
|
||||||
dist
|
|
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"trailingComma": "es5",
|
|
||||||
"tabWidth": 2,
|
|
||||||
"useTabs": false,
|
|
||||||
"semi": true,
|
|
||||||
"singleQuote": true,
|
|
||||||
"jsxSingleQuote": true,
|
|
||||||
"arrowParens": "avoid",
|
|
||||||
"endOfLine": "lf",
|
|
||||||
"bracketSpacing": true,
|
|
||||||
"htmlWhitespaceSensitivity": "strict"
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
FROM node:16.13.1-alpine as build
|
|
||||||
ENV VUE_APP_NETEASE_API_URL=/api
|
|
||||||
WORKDIR /app
|
|
||||||
RUN apk add --no-cache python3 make g++ git
|
|
||||||
COPY package.json yarn.lock ./
|
|
||||||
RUN yarn install
|
|
||||||
COPY . .
|
|
||||||
RUN yarn build
|
|
||||||
|
|
||||||
FROM nginx:1.20.2-alpine as app
|
|
||||||
|
|
||||||
COPY --from=build /app/package.json /usr/local/lib/
|
|
||||||
|
|
||||||
RUN 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
|
|
@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
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
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
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.
|
|
@ -1,11 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
presets: [
|
|
||||||
[
|
|
||||||
'@vue/cli-plugin-babel/preset',
|
|
||||||
{
|
|
||||||
useBuiltIns: 'usage',
|
|
||||||
shippedProposals: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
],
|
|
||||||
};
|
|
Before Width: | Height: | Size: 523 KiB |
Before Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 474 B |
Before Width: | Height: | Size: 750 B |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 965 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 105 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 353 KiB |
Before Width: | Height: | Size: 276 KiB |
Before Width: | Height: | Size: 1.1 KiB |
@ -1,12 +0,0 @@
|
|||||||
services:
|
|
||||||
YesPlayMusic:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
image: yesplaymusic
|
|
||||||
container_name: YesPlayMusic
|
|
||||||
volumes:
|
|
||||||
- /etc/localtime:/etc/localtime:ro
|
|
||||||
- /etc/timezone:/etc/timezone:ro
|
|
||||||
ports:
|
|
||||||
- 80:80
|
|
||||||
restart: always
|
|
@ -1,28 +0,0 @@
|
|||||||
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/;
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 253 KiB |
Before Width: | Height: | Size: 228 KiB |
Before Width: | Height: | Size: 354 KiB |
Before Width: | Height: | Size: 312 KiB |
Before Width: | Height: | Size: 389 KiB |
Before Width: | Height: | Size: 335 KiB |
Before Width: | Height: | Size: 324 KiB |
Before Width: | Height: | Size: 175 KiB |
Before Width: | Height: | Size: 339 KiB |
Before Width: | Height: | Size: 276 KiB |
@ -1,28 +0,0 @@
|
|||||||
#!/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
|
|
@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
// 支持 @ 的别名解析
|
|
||||||
"compilerOptions": {
|
|
||||||
"baseUrl": ".",
|
|
||||||
"paths": {
|
|
||||||
"@/*": ["src/*"]
|
|
||||||
},
|
|
||||||
"target": "ES6",
|
|
||||||
"module": "commonjs",
|
|
||||||
"allowSyntheticDefaultImports": true,
|
|
||||||
"jsx": "preserve"
|
|
||||||
},
|
|
||||||
"include": ["src/**/*"],
|
|
||||||
"exclude": ["node_modules"]
|
|
||||||
}
|
|
@ -1,131 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "yesplaymusic",
|
|
||||||
"version": "0.4.7",
|
|
||||||
"private": true,
|
|
||||||
"description": "A third party music player for Netease Music",
|
|
||||||
"author": "qier222<qier222@outlook.com>",
|
|
||||||
"scripts": {
|
|
||||||
"serve": "vue-cli-service serve",
|
|
||||||
"build": "vue-cli-service build",
|
|
||||||
"lint": "vue-cli-service lint",
|
|
||||||
"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",
|
|
||||||
"netease_api:run": "npx NeteaseCloudMusicApi"
|
|
||||||
},
|
|
||||||
"main": "background.js",
|
|
||||||
"dependencies": {
|
|
||||||
"@unblockneteasemusic/rust-napi": "^0.4.0",
|
|
||||||
"NeteaseCloudMusicApi": "^4.8.7",
|
|
||||||
"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",
|
|
||||||
"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.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",
|
|
||||||
"express": "^4.17.1",
|
|
||||||
"express-fileupload": "^1.2.0",
|
|
||||||
"express-http-proxy": "^1.6.2",
|
|
||||||
"extract-zip": "^2.0.1",
|
|
||||||
"howler": "^2.2.3",
|
|
||||||
"js-cookie": "^2.2.1",
|
|
||||||
"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.5.1",
|
|
||||||
"qrcode": "^1.4.4",
|
|
||||||
"register-service-worker": "^1.7.1",
|
|
||||||
"svg-sprite-loader": "^6.0.11",
|
|
||||||
"tunnel": "^0.0.6",
|
|
||||||
"vscode-codicons": "^0.0.17",
|
|
||||||
"vue": "^2.6.11",
|
|
||||||
"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",
|
|
||||||
"x11": "^2.3.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@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",
|
|
||||||
"@vue/cli-plugin-vuex": "~4.5.0",
|
|
||||||
"@vue/cli-service": "~4.5.0",
|
|
||||||
"babel-eslint": "^10.1.0",
|
|
||||||
"eslint": "^6.7.2",
|
|
||||||
"eslint-config-prettier": "^8.1.0",
|
|
||||||
"eslint-plugin-prettier": "^3.3.1",
|
|
||||||
"eslint-plugin-vue": "^7.9.0",
|
|
||||||
"husky": "^4.3.0",
|
|
||||||
"sass": "^1.26.11",
|
|
||||||
"sass-loader": "^10.0.2",
|
|
||||||
"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": {
|
|
||||||
"node": true,
|
|
||||||
"browser": true
|
|
||||||
},
|
|
||||||
"extends": [
|
|
||||||
"plugin:vue/essential",
|
|
||||||
"plugin:vue/recommended",
|
|
||||||
"plugin:prettier/recommended",
|
|
||||||
"eslint:recommended"
|
|
||||||
],
|
|
||||||
"parserOptions": {
|
|
||||||
"parser": "babel-eslint"
|
|
||||||
},
|
|
||||||
"globals": {
|
|
||||||
"ipcRenderer": "off"
|
|
||||||
},
|
|
||||||
"rules": {}
|
|
||||||
},
|
|
||||||
"browserslist": [
|
|
||||||
"> 1%",
|
|
||||||
"last 2 versions",
|
|
||||||
"not dead"
|
|
||||||
],
|
|
||||||
"husky": {
|
|
||||||
"hooks": {
|
|
||||||
"pre-commit": "npm run prettier"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"__npminstall_done": false
|
|
||||||
}
|
|
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 381 KiB |
Before Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 523 B |
Before Width: | Height: | Size: 913 B |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 149 KiB |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 126 KiB |
Before Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 223 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 353 KiB |
Before Width: | Height: | Size: 191 B |
Before Width: | Height: | Size: 308 B |
Before Width: | Height: | Size: 311 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 953 B |
Before Width: | Height: | Size: 396 B |
Before Width: | Height: | Size: 344 B |
Before Width: | Height: | Size: 218 B |
Before Width: | Height: | Size: 215 B |
Before Width: | Height: | Size: 932 B |
Before Width: | Height: | Size: 8.9 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 816 B |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 750 B |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 801 B |
Before Width: | Height: | Size: 779 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 871 B |
Before Width: | Height: | Size: 855 B |
Before Width: | Height: | Size: 656 B |
Before Width: | Height: | Size: 610 B |
Before Width: | Height: | Size: 499 B |
Before Width: | Height: | Size: 746 B |
Before Width: | Height: | Size: 1.1 KiB |
@ -1,25 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="zh">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="referrer" content="no-referrer" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
||||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
|
|
||||||
<title>
|
|
||||||
<%= htmlWebpackPlugin.options.title %>
|
|
||||||
</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<noscript>
|
|
||||||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work
|
|
||||||
properly without JavaScript enabled. Please enable it to
|
|
||||||
continue.</strong>
|
|
||||||
</noscript>
|
|
||||||
<div id="app"></div>
|
|
||||||
<!-- built files will be auto injected -->
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
@ -1,2 +0,0 @@
|
|||||||
User-agent: *
|
|
||||||
Disallow:baidu
|
|
@ -1,7 +0,0 @@
|
|||||||
commit_template: 'style: with ${restyler.name}'
|
|
||||||
restylers:
|
|
||||||
- prettier
|
|
||||||
- prettier-json
|
|
||||||
- prettier-markdown
|
|
||||||
- prettier-yaml
|
|
||||||
- whitespace
|
|
@ -1,168 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div
|
|
||||||
id="app"
|
|
||||||
class="no-scrollbar"
|
|
||||||
:class="{ 'user-select-none': userSelectNone }"
|
|
||||||
>
|
|
||||||
<Scrollbar v-show="!showLyrics" ref="scrollbar" />
|
|
||||||
<transition name="slide-up">
|
|
||||||
<Player v-if="enablePlayer" v-show="showPlayer" ref="player" />
|
|
||||||
</transition>
|
|
||||||
<Navbar v-show="showNavbar" ref="navbar" />
|
|
||||||
<main
|
|
||||||
ref="main"
|
|
||||||
:style="{ overflow: enableScrolling ? 'auto' : 'hidden' }"
|
|
||||||
@scroll="handleScroll"
|
|
||||||
>
|
|
||||||
<keep-alive>
|
|
||||||
<router-view v-if="$route.meta.keepAlive"></router-view>
|
|
||||||
</keep-alive>
|
|
||||||
<router-view v-if="!$route.meta.keepAlive"></router-view>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<Toast />
|
|
||||||
<ModalAddTrackToPlaylist v-if="isAccountLoggedIn" />
|
|
||||||
<ModalNewPlaylist v-if="isAccountLoggedIn" />
|
|
||||||
<transition v-if="enablePlayer" name="slide-up">
|
|
||||||
<Lyrics v-show="showLyrics" />
|
|
||||||
</transition>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import ModalAddTrackToPlaylist from './components/ModalAddTrackToPlaylist.vue';
|
|
||||||
import ModalNewPlaylist from './components/ModalNewPlaylist.vue';
|
|
||||||
import Scrollbar from './components/Scrollbar.vue';
|
|
||||||
import Navbar from './components/Navbar.vue';
|
|
||||||
import Player from './components/Player.vue';
|
|
||||||
import Toast from './components/Toast.vue';
|
|
||||||
import { ipcRenderer } from './electron/ipcRenderer';
|
|
||||||
import { isAccountLoggedIn, isLooseLoggedIn } from '@/utils/auth';
|
|
||||||
import Lyrics from './views/lyrics.vue';
|
|
||||||
import { mapState } from 'vuex';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'App',
|
|
||||||
components: {
|
|
||||||
Navbar,
|
|
||||||
Player,
|
|
||||||
Toast,
|
|
||||||
ModalAddTrackToPlaylist,
|
|
||||||
ModalNewPlaylist,
|
|
||||||
Lyrics,
|
|
||||||
Scrollbar,
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
isElectron: process.env.IS_ELECTRON, // true || undefined
|
|
||||||
userSelectNone: false,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
...mapState(['showLyrics', 'settings', 'player', 'enableScrolling']),
|
|
||||||
isAccountLoggedIn() {
|
|
||||||
return isAccountLoggedIn();
|
|
||||||
},
|
|
||||||
showPlayer() {
|
|
||||||
return (
|
|
||||||
[
|
|
||||||
'mv',
|
|
||||||
'loginUsername',
|
|
||||||
'login',
|
|
||||||
'loginAccount',
|
|
||||||
'lastfmCallback',
|
|
||||||
].includes(this.$route.name) === false
|
|
||||||
);
|
|
||||||
},
|
|
||||||
enablePlayer() {
|
|
||||||
return this.player.enabled && this.$route.name !== 'lastfmCallback';
|
|
||||||
},
|
|
||||||
showNavbar() {
|
|
||||||
return this.$route.name !== 'lastfmCallback';
|
|
||||||
},
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
if (this.isElectron) ipcRenderer(this);
|
|
||||||
window.addEventListener('keydown', this.handleKeydown);
|
|
||||||
this.fetchData();
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
handleKeydown(e) {
|
|
||||||
if (e.code === 'Space') {
|
|
||||||
if (e.target.tagName === 'INPUT') return false;
|
|
||||||
if (this.$route.name === 'mv') return false;
|
|
||||||
e.preventDefault();
|
|
||||||
this.player.playOrPause();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
fetchData() {
|
|
||||||
if (!isLooseLoggedIn()) return;
|
|
||||||
this.$store.dispatch('fetchLikedSongs');
|
|
||||||
this.$store.dispatch('fetchLikedSongsWithDetails');
|
|
||||||
this.$store.dispatch('fetchLikedPlaylist');
|
|
||||||
if (isAccountLoggedIn()) {
|
|
||||||
this.$store.dispatch('fetchLikedAlbums');
|
|
||||||
this.$store.dispatch('fetchLikedArtists');
|
|
||||||
this.$store.dispatch('fetchLikedMVs');
|
|
||||||
this.$store.dispatch('fetchCloudDisk');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
handleScroll() {
|
|
||||||
this.$refs.scrollbar.handleScroll();
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
html,
|
|
||||||
body,
|
|
||||||
#app {
|
|
||||||
position: fixed;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
* {
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
#app {
|
|
||||||
position: relative;
|
|
||||||
transition: all 0.4s;
|
|
||||||
}
|
|
||||||
|
|
||||||
main {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
right: 0;
|
|
||||||
left: 0;
|
|
||||||
padding: 64px 10vw 96px 10vw;
|
|
||||||
box-sizing: border-box;
|
|
||||||
scrollbar-width: none; // firefox
|
|
||||||
}
|
|
||||||
.no-scrollbar::-webkit-scrollbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.no-scrollbar {
|
|
||||||
overflow: scroll;
|
|
||||||
}
|
|
||||||
@media (max-width: 576px) {
|
|
||||||
main {
|
|
||||||
padding: 64px 5vw 96px 5vw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
main::-webkit-scrollbar {
|
|
||||||
width: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.slide-up-enter-active,
|
|
||||||
.slide-up-leave-active {
|
|
||||||
transition: transform 0.4s;
|
|
||||||
}
|
|
||||||
.slide-up-enter,
|
|
||||||
.slide-up-leave-to {
|
|
||||||
transform: translateY(100%);
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,107 +0,0 @@
|
|||||||
import request from '@/utils/request';
|
|
||||||
import { mapTrackPlayableStatus } from '@/utils/common';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取歌手单曲
|
|
||||||
* 说明 : 调用此接口 , 传入歌手 id, 可获得歌手部分信息和热门歌曲
|
|
||||||
* @param {number} id - 歌手 id, 可由搜索接口获得
|
|
||||||
*/
|
|
||||||
export function getArtist(id) {
|
|
||||||
return request({
|
|
||||||
url: '/artists',
|
|
||||||
method: 'get',
|
|
||||||
params: {
|
|
||||||
id,
|
|
||||||
timestamp: new Date().getTime(),
|
|
||||||
},
|
|
||||||
}).then(data => {
|
|
||||||
data.hotSongs = mapTrackPlayableStatus(data.hotSongs);
|
|
||||||
return data;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取歌手专辑
|
|
||||||
* 说明 : 调用此接口 , 传入歌手 id, 可获得歌手专辑内容
|
|
||||||
* - id: 歌手 id
|
|
||||||
* - limit: 取出数量 , 默认为 50
|
|
||||||
* - offset: 偏移数量 , 用于分页 , 如 :( 页数 -1)*50, 其中 50 为 limit 的值 , 默认为 0
|
|
||||||
* @param {Object} params
|
|
||||||
* @param {number} params.id
|
|
||||||
* @param {number=} params.limit
|
|
||||||
* @param {number=} params.offset
|
|
||||||
*/
|
|
||||||
export function getArtistAlbum(params) {
|
|
||||||
return request({
|
|
||||||
url: '/artist/album',
|
|
||||||
method: 'get',
|
|
||||||
params,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 歌手榜
|
|
||||||
* 说明 : 调用此接口 , 可获取排行榜中的歌手榜
|
|
||||||
* - type : 地区
|
|
||||||
* 1: 华语
|
|
||||||
* 2: 欧美
|
|
||||||
* 3: 韩国
|
|
||||||
* 4: 日本
|
|
||||||
* @param {number=} type
|
|
||||||
*/
|
|
||||||
export function toplistOfArtists(type = null) {
|
|
||||||
let params = {};
|
|
||||||
if (type) {
|
|
||||||
params.type = type;
|
|
||||||
}
|
|
||||||
return request({
|
|
||||||
url: '/toplist/artist',
|
|
||||||
method: 'get',
|
|
||||||
params,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取歌手 mv
|
|
||||||
* 说明 : 调用此接口 , 传入歌手 id, 可获得歌手 mv 信息 , 具体 mv 播放地址可调 用/mv传入此接口获得的 mvid 来拿到 , 如 : /artist/mv?id=6452,/mv?mvid=5461064
|
|
||||||
* @param {number} params.id 歌手 id, 可由搜索接口获得
|
|
||||||
* @param {number} params.offset
|
|
||||||
* @param {number} params.limit
|
|
||||||
*/
|
|
||||||
export function artistMv(params) {
|
|
||||||
return request({
|
|
||||||
url: '/artist/mv',
|
|
||||||
method: 'get',
|
|
||||||
params,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 收藏歌手
|
|
||||||
* 说明 : 调用此接口 , 传入歌手 id, 可收藏歌手
|
|
||||||
* - id: 歌手 id
|
|
||||||
* - t: 操作,1 为收藏,其他为取消收藏
|
|
||||||
* @param {Object} params
|
|
||||||
* @param {number} params.id
|
|
||||||
* @param {number} params.t
|
|
||||||
*/
|
|
||||||
export function followAArtist(params) {
|
|
||||||
return request({
|
|
||||||
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 },
|
|
||||||
});
|
|
||||||
}
|
|