Showing preview only (811K chars total). Download the full file or copy to clipboard to get everything.
Repository: listen1/listen1_chrome_extension
Branch: master
Commit: 3f24efa04512
Files: 58
Total size: 783.2 KB
Directory structure:
gitextract__a87_dzy/
├── .eslintrc.json
├── .github/
│ └── workflows/
│ └── eslint.yml
├── .gitignore
├── .prettierrc
├── LICENSE
├── README.md
├── README_EN.md
├── css/
│ ├── common.css
│ ├── common2.css
│ ├── cover.css
│ ├── hotkeys.css
│ ├── icon.css
│ ├── iparanoid.css
│ ├── iparanoid2.css
│ ├── notyf_custom.css
│ ├── origin.css
│ ├── origin2.css
│ ├── player.css
│ └── reset.css
├── i18n/
│ ├── en-US.json
│ ├── fr-FR.json
│ ├── ko-KR.json
│ ├── pt-BR.json
│ ├── zh-CN.json
│ └── zh-TC.json
├── js/
│ ├── app.js
│ ├── background.js
│ ├── bridge.js
│ ├── controller/
│ │ ├── auth.js
│ │ ├── instant_search.js
│ │ ├── my_playlist.js
│ │ ├── navigation.js
│ │ ├── platform.js
│ │ ├── play.js
│ │ ├── playlist.js
│ │ └── profile.js
│ ├── github.js
│ ├── l1_player.js
│ ├── lastfm.js
│ ├── loweb.js
│ ├── lowebutil.js
│ ├── myplaylist.js
│ ├── oauth_callback.js
│ ├── player_thread.js
│ └── provider/
│ ├── bilibili.js
│ ├── kugou.js
│ ├── kuwo.js
│ ├── localmusic.js
│ ├── migu.js
│ ├── netease.js
│ ├── qq.js
│ ├── taihe.js
│ └── xiami.js
├── listen1.html
├── manifest.json
├── manifest_firefox.json
├── package.json
└── rules_1.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .eslintrc.json
================================================
{
"parserOptions": {
"ecmaVersion": 11
},
"extends": [
"airbnb-base",
"prettier"
],
"rules": {
"camelcase": "off",
"linebreak-style": "off"
},
"globals": {
"axios": "readonly",
"window": "readonly",
"browser": "readonly",
"chrome": "readonly"
},
"env": {
"browser": true,
"node": false
},
"ignorePatterns": [
"**/vendor/*.js"
]
}
================================================
FILE: .github/workflows/eslint.yml
================================================
name: ESLint
on:
push:
branches: [master]
pull_request:
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 16
- name: Install Dependencies
run: npm ci
- name: Run ESLint
run: npx eslint .
================================================
FILE: .gitignore
================================================
# Folder view configuration files
.DS_Store
.vscode
.eslintcache
node_modules
dist
_metadata
================================================
FILE: .prettierrc
================================================
{
"singleQuote": true,
"trailingComma": "es5"
}
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2016 Listen 1
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.
================================================
FILE: README.md
================================================
# Listen 1 (Chrome Extension) V2.33.0
(最后更新于 2025 年 6 月 17 日)
[](LICENSE)
[English Version](https://github.com/listen1/listen1_chrome_extension/blob/master/README_EN.md)
## 缘起
当我发现找个想听的歌因为版权听不了,需要打开好几个网站开始搜索,来回切换让我抓狂的时候,我知道是时候该做点什么了。
妈妈再也不用担心我找不到我想听的歌了。
支持音乐平台
- 网易云音乐
- QQ 音乐
- 酷狗音乐
- 酷我音乐
- bilibili
- 咪咕音乐
- 千千音乐
搜歌,听歌,就用 `Listen1`。
[]()
V2.9.0 新特性:自动切换播放源(Beta)
当一首歌的播放源不可用时,会自动搜索其他平台,获得可用的播放源。避免了用户手动搜索的麻烦。
还有精选歌单哦。
## 官方商店安装(推荐)
按你的浏览器类型点击下面的链接安装
- [Chrome Web Store 安装](https://chrome.google.com/webstore/detail/listen-1/indecfegkejajpaipjipfkkbedgaodbp)
- [FireFox 安装](https://addons.mozilla.org/zh-CN/firefox/addon/listen1/)
- [Microsoft Edge 安装](https://microsoftedge.microsoft.com/addons/detail/bcneiehcbgahghfmgigmblcgkhihehad)
感谢 [@TNT-c](https://github.com/TNT-c) 维护 Firefox 的发布渠道
感谢 [@dhxh](https://github.com/dhxh) 维护 Microsoft Edge 的发布渠道
## Chrome 下载安装
1. 下载项目的 zip 文件,在右上方有个 `Download ZIP`, 解压到本地
2. chrome 右上角的设置按钮下找到更多工具,打开`扩展程序`
3. 选择 `加载已解压的扩展程序`(如果没有显示先选中`开发者模式`),选中解压后的文件夹,完成!
## Firefox 打包安装
1. 将根目录下 manifest_firefox.json 替换 manifest.json
2. `cd listen1_chrome_extension`
3. `zip -r ../listen1.xpi *`, 完成打包 xpi 文件
4. 打开 Firefox,加载 xpi 文件,完成安装
## QQ 音乐举报 Listen1 导致代码库临时关闭事件 (2017 年 11 月)
Listen1 的用户,有个坏消息希望和大家分享。Listen1 最近收到了[QQ 音乐的 DMCA Takedown Notice](https://github.com/github/dmca/blob/master/2017/2017-11-17-Listen1.md), 主要代码库已经因为此原因而临时关闭。悲观一点看,Listen1 项目可能会在今年内彻底消失。
Listen1 诞生的初衷从不是和大公司的争夺版权利益,而是为了给予热爱音乐的人更好的收听体验,所以,Listen1 是开源,免费的,并且不接受任何形式的捐助。正是因为有热爱音乐的 Listen1 的你们,Listen1 才发展到今天这一步。不管结果如何,Listen1 团队感谢所有支持过这个项目的人们。
在这个关系项目生死存亡的时刻,我寻求项目因为 DMCA 被 github 关闭的援助。如果有对这个比较了解如何解决的人,或者你想对这个事情发表看法和建议,可以在[issue](https://github.com/listen1/listen1_chrome_extension/issues/113)留言,或者发送邮件到 githublisten1@gmail.com。我们会尽最大努力,来守护 Listen1,即使可能它即将成为历史。
## 更新日志
`2025-06`
修复:
- 修复咪咕无法播放的问题
- 修复播放部分歌曲时播放控制失灵的问题(#1200) (#1201) (感谢 @reserveword 的提交)
- 修复 electron remote 模块以支持更多的 electron 版本 (感谢 @xihale 的提交)
- 修复新主题性能问题 (#1216) (感谢 @mikelxk 的提交)
- 修复 electron 的 cookie 未发送问题
- 修复文档拼写错误 (感谢 Nicholas Wilson)
功能改进:
- 将 chrome 插件的 manifest 升级到 V3
`2023-08 ~ 2024-04`
修复:
- 迁移哔哩哔哩用户信息获取接口 (感谢@wuhao-igno 的提交)
- 修复 QQ 音乐播放问题
- 修复酷我播放和搜索问题
- 修复酷狗音乐播放问题
`2023-07`
修复:
- 酷我音乐搜索功能错误 (感谢@yhsj0919 提供解决方案)
- 控制台报错 (感谢 @caoxiemeihao 的提交)
`2022-12 ~ 2023-03`
功能改进:
- 增加了葡萄牙语(巴西)的翻译 (感谢 @nailtonvital 的提交)
- 增加了 qq 音乐 320kbps 音质的支持 (感谢 @fecet 的提交)
修复:
- 修复了酷我音乐播放接口失效的问题 (感谢 @NickeyLin 的提交)
- 修复导出歌单失败的问题 (感谢 @@IcedWatermelonJuice 的提交)
- 修复了现在播放页面打开后图标状态的问题 (感谢 @@mnyon 的提交)
- 修复了 lastfm 不记录最近播放的问题 (感谢 @@Anmizi 的提交)
`2022-11`
功能改进:
- 增加 bilibili 歌单搜索功能(感谢 @Wei-bin-Wu 的提交)
- 优化现代主题的显示风格 (感谢 @814959822 的提交)
修复:
- 修复 bilibili 部分音乐无法播放的问题
- 修复本地音乐播放文件类型的问题 (感谢 @mikelxk 的提交)
- 修复播放 b 站音乐时的图片显示问题 (感谢 @mikelxk 的提交)
`2022-09`
功能改进
- 添加现代白,现代黑两款主题(感谢 @814959822 的提交)
- 优化了新主题性能
修复:
- 修复 bilibili 的搜索错误 (感谢 @mikelxk 的提交)
- 修复选取音乐平台时发生的闪动问题(感谢 @814959822 的提交)
- 修复新主题在歌单少于 5 首时的显示问题
`2022-08`
修复:
- 修复开启一段时间后无法播放的问题 #902 (感谢 @reserveword 的提交)
- 修复 QQ 音乐无法搜索的问题 (感谢 lx-music-desktop 提供技术方案)
- 修复 bilibili 搜索没有响应的问题
`2022-07`
功能改进:
- 增加 bilibili 视频音源搜索功能
修复:
- 修复酷狗音乐的播放错误
- 修复酷狗音乐热门歌单加载更多时的错误
- 修复 qq 音乐歌手页的错误
- 修复咪咕音乐排行榜打开时的错误
`2022-06`
功能改进
- 添加双击歌单列表和搜索结果列表播放(感谢 @piz-ewing 的提交)
- 桌面版本地音乐增加 wav 格式支持 (感谢 @mikelxk 的提交)
修复:
- 修复清空列表当前播放音乐不停止的问题(感谢 @leca 的提交)
- 酷狗音乐列表无法打开的问题
- 修复随机播放模式出现重复音乐的 bug (感谢 @piz-ewing 的提交)
`2022-02 ~ 2022-03`
功能改进:
- 增加韩语支持(感谢 @kkange 的提交)
修复:
- 酷狗音乐无法播放的问题
- 千千音乐列表接口无法访问的问题(感谢 @mikelxk 的提交)
`2021-08 ~ 2022-01`
修复:
- 修复音乐分类按钮显示没有间距的问题 (感谢 @yinzhenyu-su 的提交)
- 修复在 firefox 无法打开 bilibili 音乐的问题 (感谢 @ktmzcpl 的提交)
- 修复在 electron 环境启动时的 UI 崩溃问题
优化:
- 更平滑的当前播放切换效果 (感谢 @mikelxk 的提交)
`2021-07`
修复:
- 禁止图片拖动
- 增加快捷键中放大缩小功能的描述
- 修改 windows 用户的窗口控制按钮位置到右上角 (感谢 @mikelxk 的提交)
- 升级 howler 库 (感谢 @mikelxk 的提交)
- 修复 QQ 音乐无法搜索的问题
- 修复 chrome 浏览器媒体控制中进度条拖动的问题 (感谢 @mikelxk 的提交)
- 增加本地音乐的本地 lrc 歌词文件支持 (感谢 @mikelxk 的提交)
`2021-04`
功能改进:
- 增加 QQ 音乐的登录支持
- 增加拖拽支持,支持歌单内歌曲调整顺序,歌单调整顺序,正在播放歌曲调整顺序,以及拖动歌曲加入歌单的操作
- 支持歌单内搜索
- 桌面版支持代理设置
- 支持配置自动切换源的搜索平台
- 增加显示当前最新版本
- 增加对网易云平台的默认高码率音源支持
重构和优化:
- 将音乐平台接口做 class 改造 #553
- github 模块去除 angular 依赖 #532 (感谢 @Dumeng 的提交)
- lastfm 模块去除 angular 依赖 #532 (感谢 @Dumeng 的提交)
- 优化 UI 细节,提升用户体验 #537
修复:
- 修复需要登录才能获取咪咕播放链接,并增加码率数据 #536 (感谢 @RecluseWind 的提交)
- 修复音乐榜和影视榜在 Firefox 上的不能正确获取的 bug #536 (感谢 @RecluseWind 的提交)
- 修复某些情况下歌曲在播放前总是等待 15 秒的 bug
- 修复 QQ 音乐短链接歌单分享地址不被识别的问题
- 修复开启关闭静音功能失效的问题
- 修复 GitHub 账户无法退出的问题
- 修复 kugou 部分音乐因专辑缺失导致的播放错误
- 修复多首歌曲重复播放的问题
`2021-03`
功能改进:
- 新增千千音乐平台 (感谢 @Dumeng 的提交)
- 支持咪咕音乐的分类歌单和排行榜歌单功能 (感谢 @RecluseWind 的提交)
- 桌面版支持放大功能 (感谢 @mikelxk 的提交)
- 支持网易登录功能,支持打开我的歌单和推荐歌单
- 支持咪咕登录功能
- 支持在正在播放页面显示当前播放歌曲的码率和平台
- 移除虾米平台
重构和优化:
- 替换了对 translate,i18n, hotkeys 的 angular 模块依赖,替换为纯 js 库 (感谢 @Dumeng 的提交)
- 优化载入 feather 图标库的效率 (感谢 @Dumeng 的提交)
- 改善了多个平台默认码率,默认播放高码率音乐文件
- 将 app.js 按多个 controller 模块分为多个文件
- 优化显示了因为版权问题无法播放的通知
- 将大部分链接改成 https 协议
修复:
- 修复新语法导致媒体控制在某些系统中不可用的问题 (感谢 @mikelxk 的提交)
- 修复音量控制快捷键失效的问题 (感谢 @mikelxk 的提交)
- 修复了在 firefox 上的滚动条样式 (感谢 @RecluseWind 的提交)
- 修复酷狗音乐封面的错误
- 修复酷狗某些歌曲不能播放的问题
- 修复通知无法显示的问题
- 修复了删除当前播放列表歌曲后导致的各种异常
`2021-02`
功能改进:
- 支持分类歌单和排行榜(感谢 https://github.com/lyswhut/lx-music-desktop 提供 QQ 音乐排行实现)
- 增加繁体中文翻译 (感谢 @yujiangqaq 提供翻译)
- 增加 chrome 媒体控制上一曲,下一曲和快进快退 (感谢 @mikelxk 的提交)
- 改进桌面版桌面歌词,增加字体大小颜色设置和背景透明度调整
重构:
- 将媒体资源服务重构成 MediaService 模块,除去对 angularjs 的依赖 (特别感谢 @Dumeng 的提交)
- 增加 prettier 配置文件和 commit 前检查 (感谢 @mikelxk 的提交)
- 修正一些过往代码的格式错误 (感谢 @mikelxk 的提交)
修复:
- 修复 Github API (感谢 @NoDocCat 和 @Dumeng 的提交)
- 修复因 svg 动画导致的性能问题 (感谢 @Dumeng 的提交)
- 修复虾米部分失效 API(感谢 @RecluseWind 的提交)
- 修复 Mac 桌面版无法导入本地音乐的问题 (感谢 @virgil1996 的提交)
- 修复酷我搜索出错的问题
`2021-01`
功能改进:
- 支持插件版后台播放功能 (特别感谢 @Dumeng 的提交)
- 优化酷我代码 (感谢 @RecluseWind 的提交)
- 优化咪咕音乐代码 (感谢 @RecluseWind 的提交)
- 本地音乐支持 flac 格式 (感谢 @mikelxk 的提交)
- 在软件中增加反馈链接 (感谢 @mikelxk 的提交)
- 增加虾米歌单搜索,统一端口代码 (感谢 @RecluseWind 的提交)
- 优化了歌单访问,增加本地缓存
重构:
- 更换所有加解密库到 forge (感谢 @Dumeng 的提交)
- 去除对 jquery 库的依赖 (感谢 @Dumeng 的提交)
- 更换音频播放库到 howler.js (感谢 @Dumeng 的提交)
- 更换 http 请求库到 axios (感谢 @Dumeng 的提交)
- 支持 eslint 的 github action 语法检查 (感谢 @Dumeng 的提交)
bug 修复:
- 修复 MediaSession 不支持时的报错问题 (感谢 @Jyuaan 的提交)
- 修复咪咕歌单的 404 错误
- 修复正在播放窗口点击空白处弹回的功能 (感谢 @Demeng 的提交)
`2020-12-28`
- 修复最大,最小,关闭按钮在桌面版失效的问题
`2020-12-27`
- 修复无法显示收藏歌单的 bug
- 支持一次输入搜索所有平台(Beta)
- 修复咪咕音乐歌单只显示前 20 首歌的 bug
- 修复网易和酷狗音乐搜索错误未处理的 bug
- 修复虾米音乐歌词解析错误导致无法显示的 bug
- 根据 chrome web store 上架要求修改部分权限
`2020-12-22`
- 修复酷我音乐无法播放的问题
- 修复我创建的歌单升级后无法播放的问题
`2020-12-20`
- 修复版权问题造成的播放中断和循环弹出提示通知的 bug
- 修改歌曲封面为背景时歌词看不清的问题
- 修复 qq 搜索的一个错误,优化接口返回时处理(感谢@RecluseWind 的提交)
`2020-12-12`
- 支持 QQ 音乐歌单搜索 (感谢@RecluseWind 的提交)
- 修复网易云音乐无法打开手机分享的歌单链接的 bug (感谢@RecluseWind 的提交)
- 修复咪咕音乐无法搜索的 bug
`2020-10-28`
- 增加本地音乐(仅限桌面版)
`2020-10-27`
- 增加歌单搜索功能(暂时只支持网易云)
- 优化歌词显示
- 修复 blili 歌手 API 错误,修复歌词时间轴格式不统一产生的错误 (感谢@RecluseWind 的提交)
- 优化 UI,正在播放页增加翻译按钮
`2020-10-26`
- 增加歌词翻译功能 QQ 音乐和虾米音乐的支持(感谢@RecluseWind 的提交)
- 更新了虾米音乐获取歌曲播放地址,获取歌单,搜索 API 的获取方式,增加可靠性 (感谢@RecluseWind 的提交)
- 修复安装插件后 qq 音乐网页部分歌单无法打开的 bug
`2020-10-18`
- 增加歌词翻译功能,暂时只支持网易云音乐 (感谢@reserveword 的提交)
- 修复 bilibili 音乐无法播放的 bug
- 修复虾米播放页歌曲封面无法显示的 bug
- 修复酷我音乐歌单无法打开的 bug
`2020-09-12`
- 修复网易歌单超过 1000 首时导入失败的 bug (感谢@YueShangGuan 的提交)
- 支持显示歌曲封面作为正在播放背景 (感谢@YueShangGuan 的提交)
`2020-08-24`
- 修复虾米歌单歌曲只显示部分歌曲的 bug (感谢@RecluseWind 的提交)
- 修复歌单图片和标题显示问题 (感谢@RecluseWind 的提交)
- 支持桌面版点击链接打开系统默认浏览器
`2020-08-04`
- 增加正在播放窗口和播放列表弹窗的动画效果
- 修复虾米艺人封面图片无法显示的问题 (感谢@RecluseWind 的提交)
- 优化打开歌单功能,支持网易云排行榜单,艺人页面,专辑页面网址(感谢@whtiehack 的提交)
- 优化专辑图片显示,避免图片被压缩 (感谢@RecluseWind 的提交)
`2020-07-10`
- 修复咪咕音乐无法播放的问题
- 支持顶部搜索栏回车触发 (感谢@kangbb 的提交)
- 支持歌单歌曲数显示,支持播放/暂停全局快捷键(桌面版)(感谢@x2009again 的提交)
- 支持返回时回到滚动条历史位置(感谢@x2009again 参与完成)
- 优化 firefox 滑动条,修改 qq 音乐图标网址,解决 firefox 上架 jquery 代码问题 (感谢@RecluseWind 的提交)
`2020-06-29`
- 支持播放失败时自动切换播放源(Beta)
`2020-06-28`
- 修复网易歌单仅显示 10 首歌曲的问题
`2020-04-30`
- 修复咪咕音质较差的问题
`2020-04-27`
- 增加收藏歌单功能,特别感谢 @zhenyiLiang
- 修复咪咕音乐无法播放的 bug
- 一些细节优化
`2019-11-27`
- 加入法语支持, 特别感谢 @Leoche
`2019-09-07`
- 修复 migu 无法播放的 bug
`2019-08-09`
- 增加深色主题
`2019-07-03`
- 修复咪咕音乐无法播放的 bug
`2019-06-24`
- 增加咪咕音乐
- 修复网易音乐无法播放的 bug
- 修复酷狗音乐无法播放的 bug
`2019-06-23`
- 修复无法连接到 github 的 bug
`2019-05-26`
- 修复酷狗音乐无法播放的 bug
`2019-04-26`
- 修复虾米音乐无法播放的 bug
- 修复播放器未在页面底端显示的 bug
`2019-03-03`
- 修复删除单个歌曲导致歌单所有歌曲消失的 bug
- 修复删除单个歌单导致所有歌单消失的 bug
`2019-02-26`
- 修复 qq 音乐歌单无法显示的 bug
`2018-12-30`
- 修复酷我音乐歌单缺失歌曲的问题
- 自动检测客户端语言
`2018-12-29`
- 修复虾米音乐搜索失败的问题
- 修复部分 QQ 音乐歌曲无法播放的问题
- 修复使用插件时 QQ 官方网站无法使用的问题
`2018-12-24`
- 多语言支持,支持英文
- 新添加到歌单的歌曲将出现在歌单头部
- 修复版权通知占满屏幕的 bug
`2018-12-22`
- 全新版本 2.0 发布,更新界面(特别感谢@iparanoid 提供主题设计)
- 升级 jquery 和 angular 版本
`2018-12-21`
- 修复虾米音乐歌单访问的问题
- 修复网易云音乐歌单只有一首歌的问题
- 修复 bilibili 滚动时加载重复歌单的问题
- 修复酷狗部分音乐无法播放的问题
- 修复 Github Gist 备份无法导入的问题
- 升级 soundmanager2 库到最新版本
`2018-12-05`
- 完全修复虾米音乐歌单访问的问题
`2018-08-25`
- 修复虾米音乐无法播放的 bug
`2018-06-15`
- 增加酷我音乐的支持(特别感谢@WinterXMQ 的提交)
`2018-06-10`
- 修复酷狗音乐收藏歌单后可能显示空歌单的 bug
`2018-06-10`
- 修复虾米音乐无法显示歌词的 bug
`2018-06-05`
- 增加酷狗音乐的支持(感谢@WinterXMQ )
`2018-05-30`
- 修复 QQ 音乐无法播放的问题(感谢@noschoollee 提供修复方案)
`2018-04-23`
- 修复虾米音乐无法播放的问题
`2018-02-18`
- 修复无法创建歌单的 bug
- 修复点击关闭歌单按钮后无法再打开歌单的 bug
- 增加歌曲主页,点击封面可进入(特别感谢@iparanoid 提供歌曲页面 UI 设计)
`2018-02-15`
- 修复随机播放在播放列表播放结束后自动停止的问题,开启无限洗脑循环(感谢@sunjie21 的提交)
- 增加将当前播放列表全部添加到歌单的功能 (感谢@sunjie21 的提交)
- 修复标题播放状态不实时更新的 bug (感谢@sibojia 的提交)
`2018-02-14`
- 修复主页在加载更多数据时出现双重滚动条的 bug,并修改了滚动条样式(感谢@zhuzhuyule 的提交)
- 修复打开歌单时,网易云音乐个人歌单地址无法解析的 bug(感谢@zhuzhuyule 的提交)
`2017-12-26`
- 增加同步歌单到 Github Gist 功能。(特别感谢@ConstLhq 提供创意和部分代码实现)
`2017-12-20`
- 增加搜索翻页功能,你可以看到更多的搜索结果了。(感谢@ConstLhq 的提交)
- 增加合并歌单功能。可以快速的把其它你创建的歌曲合并到当前的歌单中了。(感谢@Dumeng 的提交)
`2017-11-27`
- 修复网易云音乐歌单只显示第一首歌的 Bug(感谢[@Binaryify/NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi)提供接口实现)
`2017-11-18`
- 修复版权原因无法播放歌曲时自动暂停的问题
`2017-11-17`
- 在我的歌单页面增加“打开歌单”功能,可打开支持网页的歌单链接地址。这样就可以导入你喜欢的歌单了。
- HTTP 请求头部的 Origin 字段设置为正常网址
`2017-10-16`
- 修复 QQ 音乐歌单翻页显示重复的问题(感谢@Moobusy 的提交)
`2017-10-03`
- 修复网易云音乐歌单无法显示的问题(感谢@Moobusy 的提交)
`2017-09-14`
- 修复 QQ 音乐无法播放的 bug
`2016-05-27`
- 增加快捷键功能(输入?查看快捷键设置)
- 支持同步播放记录到 last.fm
- 增加搜索 loading 时的图标(感谢@richdho 的提交)
- 页面标题增加显示当前播放信息
- 修复了在收藏对话框点击取消出现新建歌单的 bug
- 重新组织代码文件夹结构
`2016-05-21`
- 增加歌单分页加载功能(感谢@wild-flame 的提交)
- 修复关闭按钮随网页滚动的 bug
- 修复点击暂停按钮会重置进度条和歌词的 bug
- 修复点击歌单名称不跳转的 bug
- 调整歌单水平位置居中
`2016-05-14`
- 增加 firefox 插件支持(感谢 fulesdle 的提交)
`2016-05-13`
- 增加我的歌单功能,可以收藏现有歌单,并创建自己的歌单
- 点击 Listen 1 和图标可以回到首页
- 标记了部分因版权无法播放的歌曲,增加版权提示
- 重构了音乐平台代码,使用统一的接口规范
- 重构了歌单接口,合并歌手,专辑和歌单接口
- 修复了阿里云歌手链接点击错误的 bug
`2016-05-08`
- 增加歌词显示
- 精选歌单:添加歌单到当前播放列表,可点击跳转到原始链接
- 修复了搜索 qq 音乐时的乱码问题
- 修复了循环播放网易歌曲一段时间后暂停的 bug
- 修复了可能导致微信公众号无法登录的 bug
- 优化性能,删除了不必要的事件消息触发
`2016-05-02`
- 增加音量控制
## License
MIT
================================================
FILE: README_EN.md
================================================
# Listen 1 (Chrome Extension) V2.33.0
(Last Update June 17th, 2025)
[](LICENSE)
## One for all free music in China
When I found many songs are unavailable because copyright issue, I realized there's something I should do.
Mom never need to worry about I can't listen my favorite songs.
Supported music platform:
- Netease
- QQ
- Kugou
- Kuwo
- Bilibili
- Migu
- Qianqian (taihe)
Search songs, listen songs from multiple platforms, that's `Listen 1`.
V2.9.0 New Feature: Auto choose source
when music play source url is not available, auto choose source from other sources.
Making your own playlist is also supported.
## How to change language ?
1. Click Settings icon in right top of application
2. Click `English` under `Language` or `语言`
## Install (Chrome)
1. download zip file from github and uncompress to local.
2. open Extensions from chrome.
3. Choose `Load unpacked`(Open Develop Mode first),Click folder you just uncompressed, finish!
## Install (Firefox)
1. Visit Listen1 Firefox Page https://addons.mozilla.org/zh-CN/firefox/addon/listen-1/
2. Click Add to Firefox button
## Changelog
`2025-06`
Fix bugs:
- fix migu playing error
- fix playing control problem (#1200) (#1201) (thanks @reserveword )
- fix electron remote to support more electron version (thanks @xihale )
- fix performance issue for new theme (#1216) (thanks @mikelxk )
- fix electron cookie send problem
- fix spell error (thanks Nicholas Wilson)
Features:
- migrate chrome extension manifest version to V3
`2023-08 ~ 2024-04`
Fix bugs:
- Migrate bilibili artist info api (thanks @wuhao-igno)
- fix qq music
- fix kugou music
- fix kuwo music
`2023-07`
Fix bugs:
- kuwo search api error(thanks @yhsj0919)
- console output error(thanks @caoxiemeihao)
`2022-12 ~ 2023-03`
Features:
- Add language support for Brazilian portuguese (thanks @nailtonvital)
- Add new quality 320kpbs for qq music (thanks @fecet)
Fix bugs:
- fix kuwo music play url error (thanks @NickeyLin)
- fix songlist export problem (thanks @@IcedWatermelonJuice)
- fix icon state when toggle now playing page (thanks @@mnyon)
- fix lastfm record error (thanks @@Anmizi)
`2022-11`
Features:
- Search playlist for bilibili video (thanks @Wei-bin-Wu)
- Optimize modern theme style (thanks @814959822)
Fix bugs:
- Fix bilibili tracks play error
- Fix local music play problem related to file types (thanks @mikelxk)
- Fix image related problem when playing bilibili music (thanks @mikelxk)
`2022-09`
Features:
- Add new themes: modern white, modern black(thanks @814959822)
- Optimize new theme performance
Fix bugs:
- fix bilibili search problem (thanks @mikelxk)
- fix hover shaking problem when choose platform(thanks @814959822)
- fix player bar empty when playlist contains less than five songs in modern theme
`2022-08`
Fix bugs:
- fix music can't play after idle for a while #902 (thanks @reserveword)
- fix qq music search not working (thanks to lx-music-desktop for solution)
- fix bilibili search response error
`2022-07`
Features:
- add bilibili search page for audio in video search
Fix bugs:
- fix kugou music play error
- fix kugou hot playlist load more bug
- fix qq singer page error
- fix migu top list open error
`2022-06`
Features:
- Double click to play in playlist and search result page(thanks @piz-ewing)
- Support wav format local file in desktop version (thanks @mikelxk)
Fix bugs:
- fix shuffle mode play duplicate music bug (thanks @piz-ewing)
- fix music continue to play when clear now playing playlist (thanks @leca)
- fix kugou music play fail
`2022-02 ~ 2022-03`
Features:
- Add Korean language support(thanks @kkange)
Fix bugs:
- fix kugou api play song error
- fix qianqian music api error(thanks @mikelxk)
`2021-08 ~ 2022-01`
Fix bugs:
- fix music category line height (thanks @yinzhenyu-su)
- fix bilibili play issue in firefox (thanks @ktmzcpl)
- fix UI crash in electron environment
Optimaze:
- More fluent effect for current playing switching (thanks @mikelxk)
`2021-07`
Fix Bugs:
- disable image drag
- add shortcuts description for zoom in/out
- move window control panel to top right for windows users (thanks @mikelxk)
- upgrade howler lib (thanks @mikelxk)
- fix QQ search problem
- fix media center progress bar control for chrome users
- add local lrc file support when import local music (thanks @mikelxk)
`2021-04`
Features:
- QQ Login
- Drag and drop to reorder songs in playlist, reorder playlist and quick add song to playlist
- Search in playlist
- Proxy setting (desktop version only)
- Configure auto detect playable source list
- Display latest version in setting page
- Highest bitrate for netease music
Refactor:
- Change music platform resource API to class #553
- remove angular dependency for github module #532 (thanks @Dumeng)
- remove angular dependency for lastfm module #532 (thanks @Dumeng)
- UX optimaze #537
Fix Bugs:
- Fix migu resource api to use without login, add bitrate info #536 (thanks @RecluseWind)
- Fix display error in firefox for migu hot rank #536 (thanks @RecluseWind)
- Fix sometimes song keep waiting for 15 seconds before playing bug
- Fix qq short link parse error
- Fix toggle mute error
- Fix GitHub logout error
- Fix some kugou music without album play error
- Fix two songs play in same time
`2021-03`
Features:
- Add qianqian music platform (thanks @Dumeng)
- Support playlist filters and top list in migu (thanks @RecluseWind)
- Zoom in/out function for desktop version (thanks @mikelxk)
- Support netease login, show my playlist and recommend playlist
- Support migu login
- Show bitrate and music platform in now playing page
- deprecated xiami
Refactor:
- Replace angular module dependencies: translate,i18n, hotkeys,replace with js library (thanks @Dumeng)
- Optimaze feather load performance (thanks @Dumeng)
- Optimaze bitrate for qq and kugou platform, default high bitrate
- Split app.js into files by controller
- Optimaze copyright notice show
- Change http to https for several links
Fix bugs:
- Fix media control invalid because new es6 optional chain (thanks @mikelxk)
- Fix volume control not working (thanks @mikelxk)
- Fix scroll bar style in firefox (thanks @RecluseWind)
- Fix kugou music cover url
- Fix kugou music play url
- Fix notification not shown bug
- Fix delete songs in current playlist mess up playing bug
`2021-02`
Features:
- Support playlist filters and top playlist (special thanks [lyswhut/lx-music-desktop](https://github.com/lyswhut/lx-music-desktop) )
- Add Traditional Chinese language (thanks @yujiangqaq)
- Add chrome media panel function: prev/next track, back/forward (thanks @mikelxk)
- New lyric floating window, support config font size, color and background transparency
Refactor:
- Build MediaService module,remove dependency on angularjs(special thanks @Dumeng)
- Add prettier config file, add pre-commit style check(thanks @mikelxk)
- Fix history code style problems(thanks @mikelxk)
Fix bugs:
- Fix Github API (thanks @NoDocCat 和 @Dumeng)
- Fix svg animation performance issue (thanks @Dumeng)
- Fix xiami API(thanks @RecluseWind)
- Fix import local music error for mac desktop version(thanks @virgil1996)
- Fix kuwo search error
`2021-01`
Features:
- support play music background (thanks @Dumeng)
- optimaze kugo related code (thanks @RecluseWind)
- optimaze migu related code (thanks @RecluseWind)
- support flac for local music (thanks @mikelxk)
- add feedback link (thanks @mikelxk)
- optimaze xiami music, add playlist search (thanks @RecluseWind)
- optimaze cache for playlist
Refactor:
- replace encrypt lib to forge (thanks @Dumeng)
- remove jquery (thanks @Dumeng)
- replace ngsoundmanager2 to howler.js (thanks @Dumeng)
- replace angular http to axios (thanks @Dumeng)
- support eslint check in github action (thanks @Dumeng)
Fix bugs:
- fix MediaSession error when not supported (thanks @Jyuaan)
- fix migu playlist 404 link
- fix current playing music list modal (thanks @Demeng)
`2020-12-28`
- fix bug for desktop: max,min,close button not available
`2020-12-27`
- fix bug: can't play favorite playlist
- feature: search all music (beta)
- fix bug: migu playlist shows first 20 tracks
- fix bug: netease/kugou search error not handle
- fix bug: xiami lyric parse error
- change manitest permission config to pass chrome web store review
`2020-12-22`
- fix bug: kuwo music can't be played
- fix bug: after upgrade v2.17.2, my playlist can't be played
`2020-12-20`
- fix play interrupted by copyright notice bug, infinite notice popup bug
- change style for now playing page when using album cover as background
- fix minor bug for qq search and optimaze api handler(thanks @RecluseWind)
`2020-12-12`
- support search songlist for qq music (thanks @RecluseWind)
- fix bug: netease songlist shared by mobile open error (thanks @RecluseWind)
- fix bug: migu search song error
`2020-10-28`
- add local music (desktop version only)
`2020-10-27`
- support search playlist (only for netease by now)
- optimaze lyric display
- fix bilibili artist api, fix lyric time tag format parse error (thanks @RecluseWind)
- optimaze UI, add translate button in now playing page
`2020-10-26`
- add lyric translation support for qq music, xiami music (thanks @RecluseWind)
- update xiami api including get playlist, search, play music (thanks @RecluseWind)
- fix bug some playlist not response in qq music website after installed extension
`2020-10-18`
- add lyric translation, now for netease music only (thanks @reserveword)
- fix bilibili play fail bug
- fix xiami now playing page music cover missing bug
- fix kuwo music can't open bug
`2020-09-12`
- fix netease songlist contains more than 1k tracks import error (thanks @YueShangGuan)
- support album cover as nowplaying background (thanks @YueShangGuan)
`2020-08-24`
- fix xiami songlist only shows part of songs bug (thanks @RecluseWind)
- fix songlist cover and title display bug (thanks @RecluseWind)
- support open url using system default browser for desktop version
`2020-08-04`
- add animation for now playing and current playlist window
- fix xiami cover image not loaded bug (thanks @RecluseWind)
- optimaze open songlist url, support netease toplist, artist, album (thanks @whtiehack)
- optimaze cover image display, avoid resize (thanks @RecluseWind)
`2020-07-10`
- fix migu play fail bug
- support press enter key to search in search bar thanks @kangbb)
- support playlist song count show, support play/pause shortcut, desktop only(thanks @x2009again)
- support restore scrollbar offset when go back(thanks @x2009again for discuss solution)
- optimaze firefox scorlling bar, modify source image url for qq music, fix firefox jquery lib md5 error(thanks @RecluseWind)
`2020-06-29`
- support auto choose source when play fail
`2020-06-28`
- fix netease music only show 10 tracks bug
`2020-04-30`
- fix migu poor music quality bug
`2020-04-27`
- support adding playlist to favorite, special thanks to @zhenyiLiang
- fix migu music
- some minor optimaze
`2019-11-27`
- add frech language, special thanks to @Leoche
`2019-09-07`
- fix migu
`2019-08-09`
- add dark theme
`2019-07-03`
- fix migu play error
`2019-06-24`
- add migu music
- fix kugou play bug
- fix netease play bug
`2019-06-23`
- fix connect to github.com error
`2019-05-26`
- fix kugou music can't play bug
`2019-04-26`
- fix xiami music can't play bug
- fix footer player out of page bug
`2019-03-03`
- fix delete single playlist destroy all playlists bug
`2019-02-26`
- fix qq music songlist not shown bug
`2018-12-30`
- fix songs missing in kuwo playlist
- auto detect language
`2018-12-29`
- fix fail on xiami search
- fix some qq songs fail to play
- fix qq music web visit problem after extension installed
`2018-12-24`
- i18n support, support English language.
- new song will now add to top of playlist
- copyright notification will not mess up the screen
`2018-12-22`
- Version 2.0 released. New UI(Special Thanks to @iparanoid)
- Upgrade jquery, Angular
`2018-12-21`
- Fix xiami playlist bug
- Fix netease playlist only shows one song bug
- Fix bilibili first load duplicate playlists
- Fix can't play some kugou songs
- Fix github gist backup recover bug
- Upgrade soundmanager2
## License
MIT
================================================
FILE: css/common.css
================================================
html,
body {
margin: 0;
padding: 0;
font-size: var(--text-default-size);
color: var(--text-default-color);
font-family: system-ui, 'PingFang SC', STHeiti, sans-serif;
}
a {
cursor: pointer;
}
.wrap {
/* https://stackoverflow.com/questions/28897089/z-index-on-borders */
outline: solid 1px var(--windows-border-color);
box-sizing: border-box;
}
/* remove focus highlight */
input:focus,
select:focus,
textarea:focus,
button:focus {
outline: none;
}
ul {
list-style: none;
margin: 0;
padding: 0;
}
input,
svg,
.icon {
-webkit-app-region: no-drag;
}
button {
background-color: var(--button-background-color);
color: var(--text-default-color);
cursor: pointer;
border: solid 1px var(--button-background-color);
border-radius: var(--default-border-radius);
padding: 5px;
min-width: 80px;
min-height: 32px;
}
button:hover {
background-color: var(--button-hover-background-color);
}
img {
-webkit-user-drag: none;
}
.l1-button {
background-color: var(--button-background-color);
color: var(--text-default-color);
border-radius: var(--default-border-radius);
padding: 5px;
margin-right: 4px;
color: var(--text-default-color);
cursor: pointer;
display: inline-block;
}
.l1-button:hover {
background: var(--button-hover-background-color);
}
svg {
width: 24px;
height: 24px;
stroke: currentColor;
stroke-width: 1;
stroke-linecap: round;
stroke-linejoin: round;
fill: none;
cursor: pointer;
/* stroke: var(--icon-default-color);*/
}
/* svg:hover {
fill: var(--icon-highlight-color);
stroke: var(--icon-highlight-color);
} */
.icon {
/* default icon settings */
font-size: 16px;
cursor: pointer;
}
/* tools utils */
.flex-scroll-wrapper {
flex: 1;
height: 100px;
overflow-y: scroll;
scrollbar-width: thin;
scrollbar-color: var(--scroll-color) var(--content-background-color);
}
/* scroll bar style */
::-webkit-scrollbar {
width: 14px;
height: 18px;
background: transparent;
}
::-webkit-scrollbar-thumb {
height: 49px;
border: 5px solid rgba(0, 0, 0, 0);
background-clip: padding-box;
border-radius: 7px;
-webkit-border-radius: 7px;
background-color: var(--scroll-color);
/*rgba(151, 151, 151, 0.4);*/
/* -webkit-box-shadow: inset -1px -1px 0px rgba(0, 0, 0, 0.05), inset 1px 1px 0px rgba(0, 0, 0, 0.05);*/
}
::-webkit-scrollbar-button {
width: 0;
height: 0;
display: none;
}
::-webkit-scrollbar-corner {
background-color: transparent;
}
/* main framework start */
.wrap {
display: flex;
height: 100vh;
flex-direction: column;
margin: auto;
}
/* split screen to up/down 2 parts */
.main {
flex: 1;
display: flex;
overflow: hidden;
}
.footer {
background: var(--foot-background-color);
height: 60px;
border-top: solid 1px var(--line-default-color);
display: flex;
position: relative;
z-index: 99;
}
/* split main to left/right 2 parts */
.main .sidebar {
flex: 0 0 200px;
display: flex;
flex-direction: column;
background: var(--sidebar-background-color);
}
.main .content {
background: var(--content-background-color);
flex: 1;
display: flex;
flex-direction: column;
}
/* split content to up/down 2 parts */
.main .content .navigation {
height: 46px;
flex: 0 0 46px;
border-bottom: solid 1px var(--line-default-color);
display: flex;
align-items: center;
-webkit-app-region: drag;
}
.main .content .browser {
flex: 1;
}
/* main framework end */
/*****************************************************************/
/* main sidebar start */
.sidebar .menu-control {
height: 43px;
width: 125px;
-webkit-app-region: drag;
}
.sidebar .menu-title {
height: 28px;
line-height: 28px;
margin: 0 12px 4px 12px;
color: var(--link-default-color);
padding-left: 10px;
display: flex;
align-items: center;
font-size: 12px;
}
.sidebar .menu-title .title {
flex: 1;
}
.sidebar .menu-title svg {
flex: 0 0 18px;
}
.sidebar ul li {
cursor: pointer;
padding-left: 10px;
border-top: solid 2px transparent;
border-bottom: solid 2px transparent;
margin-bottom: -2px;
}
.sidebar ul li .sidebar-block {
display: flex;
align-items: center;
line-height: 28px;
padding-left: 12px;
margin: 3px 0;
color: var(--text-default-color);
border-radius: var(--default-border-radius);
}
.sidebar svg {
width: 18px;
height: 18px;
}
.sidebar ul li a {
margin-left: 10px;
width: 125px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.sidebar ul li:hover .sidebar-block {
background: var(--sidebar-hover-background-color);
color: var(--sidebar-hover-text-color);
}
.sidebar ul li.active .sidebar-block,
.sidebar ul li.active:hover .sidebar-block {
background: var(--sidebar-highlight-background-color);
color: var(--sidebar-highlight-text-color);
}
.sidebar ul li.dragover .sidebar-block {
background: var(--sidebar-highlight-background-color);
color: var(--sidebar-highlight-text-color);
}
/*
avoid hover effect trigger dragleave event
https://stackoverflow.com/questions/19889615/can-an-angular-directive-pass-arguments-to-functions-in-expressions-specified-in
*/
.sidebar ul li * {
pointer-events: none;
}
/* main sidebar end */
/* widget navigation start */
.navigation svg {
width: 18px;
height: 18px;
color: var(--icon-default-color);
}
.navigation .icon svg {
color: var(--text-default-color);
}
.navigation .backfront {
flex: 0 0 45px;
line-height: 46px;
vertical-align: middle;
padding: 0 13px;
}
.navigation .search {
flex: 1;
}
.navigation .settings {
flex: 0 0 32px;
}
.navigation .icon {
color: var(--text-default-color);
opacity: 0.5;
}
.navigation .icon:hover {
opacity: 1;
}
.navigation .backfront .icon {
display: inline-block;
vertical-align: middle;
margin-bottom: 4px;
}
.navigation .backfront .icon:nth-of-type(1) {
margin-right: 8px;
}
.navigation .search-input {
width: 270px;
height: 23px;
background: var(--search-input-background-color);
border-style: none;
border-radius: var(--default-border-radius);
padding-left: 10px;
font-size: 12px;
color: var(--text-default-color);
}
.navigation .window-control {
flex: 0 0 105px;
border-left: solid 1px var(--window-control-border-color);
margin-left: 15px;
}
.navigation .window-control svg {
margin-left: 8px;
}
.navigation .window-control svg:first-of-type {
margin-left: 15px;
}
/* navigation end */
/* page hot-playlist start */
.page-hot-playlist {
max-width: 850px;
margin: 0 auto;
}
.playlist-covers {
margin: 0;
padding: 0 13px;
display: flex;
flex-flow: row wrap;
position: relative;
}
.playlist-covers li {
flex: 0 1 calc(20% - 26px);
min-height: 156px;
color: var(--text-default-color);
margin: 0 13px;
}
.playlist-covers .u-cover {
display: flex;
position: relative;
}
.playlist-covers .u-cover img {
height: 136px;
min-width: 136px;
max-width: 100%;
object-fit: cover;
margin: auto;
border: solid 1px var(--line-default-color);
margin-bottom: 2px;
cursor: pointer;
}
.playlist-covers .u-cover .bottom {
position: absolute;
right: 5px;
bottom: 10px;
height: 30px;
width: 30px;
cursor: pointer;
opacity: 0;
transition: opacity 0.2s linear;
}
.playlist-covers .u-cover:hover .bottom {
opacity: 1;
}
.playlist-covers .u-cover .bottom svg {
height: 30px;
width: 30px;
fill: rgba(200, 200, 200, 0.5);
stroke-width: 1;
stroke: #ffffff;
}
.playlist-covers .u-cover .bottom svg:hover {
fill: rgba(100, 100, 100, 0.5);
}
.playlist-covers .desc {
cursor: pointer;
}
.playlist-covers .desc .title {
display: flex;
min-height: 32px;
margin: 0 0 5px;
}
/* page hot-playlist end */
/* page playlist-detail start */
.page .playlist-detail {
padding-bottom: 37px;
}
.page .playlist-detail .detail-head {
display: flex;
}
.page .playlist-detail .detail-head img {
height: 150px;
}
.page .playlist-detail .detail-head .detail-head-cover {
flex: 0 0 150px;
padding: 26px 26px 8px 26px;
}
.page .playlist-detail .detail-head .detail-head-title {
flex: 1;
}
.playlist-button-list {
display: flex;
flex-flow: row wrap;
}
.playlist-button-list .playlist-button {
height: 26px;
border: solid 1px var(--button-border-color);
cursor: pointer;
border-radius: 2px;
display: flex;
margin: 0 20px 20px 0;
}
.playlist-button-list .playlist-button.playadd-button {
flex: 0 0 136px;
}
.playlist-button-list .playlist-button .play-list {
flex: 1;
padding: 0 18px;
display: flex;
align-items: center;
}
.playlist-button-list .playlist-button .play-list svg {
margin-right: 4px;
}
.playlist-button-list .playlist-button.playadd-button .play-list svg {
width: 14px;
height: 14px;
flex: 0 0 14px;
margin-right: 4px;
stroke: var(--important-color);
fill: var(--important-color);
}
.playlist-button-list .playlist-button .play-list .icon {
margin-right: 8px;
}
.playlist-button-list .playlist-button.playadd-button .play-list .icon {
flex: 0 0 14px;
margin-right: 4px;
color: var(--important-color);
}
.playlist-button-list .playlist-button.playadd-button .add-list {
flex: 0 0 26px;
height: 26px;
width: 26px;
border-left: solid 1px var(--button-border-color);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
}
.playlist-button-list .playlist-button.edit-button .play-list.favorited {
color: var(--text-default-color);
}
.playlist-button-list .playlist-button.edit-button .play-list.notfavorite {
color: var(--text-default-color);
}
.playlist-button-list .playlist-button .play-list:hover,
.playlist-button-list .playlist-button.playadd-button .add-list:hover {
background: var(--button-hover-background-color);
}
.playlist-button-list .playlist-button.playadd-button .add-list svg {
width: 14px;
height: 14px;
}
.playlist-button-list .playlist-button.clone-button,
.playlist-button-list .playlist-button.edit-button,
.playlist-button-list .playlist-button.fav-button {
flex: 0 0 auto;
}
.playlist-button-list .playlist-button.clone-button .play-list svg,
.playlist-button-list .playlist-button.edit-button .play-list svg,
.playlist-button-list .playlist-button.fav-button .play-list svg {
width: 16px;
height: 16px;
flex: 0 0 16px;
margin-right: 8px;
stroke: rgb(102, 102, 102);
}
.playlist-button-list .playlist-button.fav-button .play-list.favorited svg {
fill: rgb(102, 102, 102);
}
.page .playlist-detail .detail-head .detail-head-title h2 {
font-size: var(--h2-title-font-size);
}
/* page playlist detail end */
/* page song detail start */
.page .songdetail-wrapper {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 60px;
background: var(--now-playing-page-background-color);
overflow: hidden;
border: solid 1px var(--windows-border-color);
-webkit-app-region: no-drag;
transition: all 0.3s;
}
.page .songdetail-wrapper .draggable-zone {
position: absolute;
left: 0;
top: 0;
right: 0;
-webkit-app-region: drag;
height: 80px;
}
.page .songdetail-wrapper.slidedown .draggable-zone {
display: none;
-webkit-app-region: no-drag;
}
.page .songdetail-wrapper .translate-switch {
border: solid 1px;
width: 20px;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
position: absolute;
bottom: 30px;
right: 30px;
color: #888888;
cursor: pointer;
-webkit-app-region: no-drag;
}
.page .songdetail-wrapper .translate-switch:hover {
color: var(--text-default-color);
}
.page .songdetail-wrapper .translate-switch.selected {
color: var(--text-default-color);
}
.page .songdetail-wrapper.slidedown {
top: calc(100% - 60px);
}
.page .songdetail-wrapper .close {
position: absolute;
top: 24px;
left: 24px;
height: 24px;
width: 24px;
cursor: pointer;
-webkit-app-region: no-drag;
}
.page .songdetail-wrapper .close.mac {
top: 44px;
}
.page .songdetail-wrapper .window-control {
position: absolute;
top: 24px;
right: 24px;
height: 24px;
cursor: pointer;
-webkit-app-region: no-drag;
z-index: 99;
}
.page .songdetail-wrapper .window-control svg {
margin-left: 8px;
stroke: var(--now-playing-close-icon-color);
}
.page .songdetail-wrapper .close svg {
stroke: var(--now-playing-close-icon-color);
}
.page .bg {
opacity: 0.5;
height: 100%;
text-align: center;
line-height: 100%;
float: left;
width: 100%;
background-repeat: no-repeat;
background-position: center;
background-size: cover;
filter: blur(10px) brightness(0.6);
transition: background ease-in-out 1.5s;
}
.page .playsong-detail {
position: absolute;
left: 10px;
right: 10px;
max-width: 770px;
margin: 0 auto;
display: flex;
height: 100%;
}
.page .playsong-detail .detail-head {
flex: 0 0 350px;
overflow: hidden;
}
.page .playsong-detail .detail-head .detail-head-cover {
width: 250px;
height: 250px;
margin-top: 110px;
}
.page .playsong-detail .detail-head img {
width: 250px;
height: 250px;
object-fit: cover;
}
.page .playsong-detail .detail-songinfo {
flex: 1;
margin-top: 80px;
display: flex;
flex-direction: column;
overflow: hidden;
-webkit-app-region: no-drag;
}
.page .playsong-detail .detail-songinfo .title {
display: flex;
align-items: center;
}
.page .playsong-detail .detail-songinfo .title h2 {
font-size: var(--h2-title-font-size);
font-weight: 400;
}
.page .playsong-detail .detail-songinfo .title .badge {
font-size: var(--badge-font-size);
color: var(--badge-font-color);
border: solid 1px var(--badge-border-color);
border-radius: 3px;
margin-left: 5px;
padding-left: 4px;
padding-right: 4px;
margin-top: 4px;
box-sizing: border-box;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
white-space: nowrap;
}
.page .playsong-detail .detail-songinfo .title .badge.platform {
padding-top: 1px;
}
.page .playsong-detail .detail-songinfo .title .badge:first-of-type {
margin-left: 15px;
}
.page .playsong-detail .detail-songinfo .info {
border-bottom: solid 1px var(--line-default-color);
padding-bottom: 6px;
flex: 0 0 20px;
display: flex;
}
.page .playsong-detail .detail-songinfo .info a {
cursor: pointer;
}
.page .playsong-detail .detail-songinfo .info .singer {
flex: 1;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.page .playsong-detail .detail-songinfo .info .album {
flex: 2;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.page .playsong-detail .detail-songinfo .info span {
color: var(--lyric-default-color);
}
.page .coverbg .playsong-detail .detail-songinfo .info span {
color: var(--lyric-on-cover-color);
}
.page .playsong-detail .detail-songinfo .lyric {
position: relative;
flex: 0 0 380px;
overflow-y: scroll;
color: var(--lyric-default-color);
scrollbar-width: thin;
scrollbar-color: var(--scroll-color) transparent;
font-size: var(--lyric-font-size);
}
.page .coverbg .playsong-detail .detail-songinfo .lyric {
color: var(--lyric-on-cover-color);
}
.page .playsong-detail .detail-songinfo .lyric p {
margin: var(--lyric-line-margin) 0 0 0;
}
.page .playsong-detail .detail-songinfo .lyric p.translate {
margin: 5px 0 0 0;
}
.page .playsong-detail .detail-songinfo .lyric p.hide {
display: none;
}
.page .playsong-detail .detail-songinfo .lyric p.highlight {
color: var(--lyric-important-color);
}
.page .coverbg .playsong-detail .detail-songinfo .lyric p.highlight {
color: var(--lyric-important-on-cover-color);
}
ul.detail-songlist {
padding: 0 25px;
position: relative;
}
ul.detail-songlist .playlist-search {
position: absolute;
right: 0;
top: -30px;
}
ul.detail-songlist .playlist-search .playlist-search-icon {
width: 14px;
position: absolute;
left: 7px;
top: 1px;
}
ul.detail-songlist .playlist-search .playlist-clear-icon {
width: 14px;
position: absolute;
left: 158px;
}
ul.detail-songlist .playlist-search .playlist-search-input {
margin-right: 28px;
margin-bottom: 10px;
border: none;
height: 24px;
border-radius: 12px;
padding: 0 30px;
background: var(--content-background-color);
color: #bbbbbb;
width: 120px;
}
ul.detail-songlist .playlist-search .playlist-search-input:hover {
background-color: var(--songlist-odd-background-color);
}
ul.detail-songlist .playlist-search .playlist-search-input::placeholder {
color: #bbbbbb;
}
ul.detail-songlist li {
/* https://stackoverflow.com/questions/4157005/css-positioning-z-index-negative-margins */
position: relative;
display: flex;
border-top: solid 2px var(--songlist-border-color);
border-bottom: solid 2px var(--songlist-border-color);
height: 37px;
align-items: center;
padding: 0 20px;
font-size: 14px;
margin-bottom: -2px;
}
ul.detail-songlist li.playlist-result {
height: 80px;
padding: 0 10px;
}
ul.detail-songlist li.odd {
background-color: var(--songlist-odd-background-color);
}
ul.detail-songlist li:hover,
ul.detail-songlist li.odd:hover {
background-color: var(--songlist-hover-background-color);
}
ul.detail-songlist li a {
cursor: pointer;
}
ul.detail-songlist li a.disabled {
color: var(--disable-song-title-color);
}
ul.detail-songlist li a span.source {
border: solid 1px #ccc;
border-radius: 4px;
margin-right: 10px;
display: inline-block;
padding: 0 4px;
color: #ccc;
font-size: 12px;
width: 24px;
text-align: center;
}
ul.detail-songlist li a span.source.playlist {
margin-left: 10px;
margin-right: 0;
}
ul.detail-songlist li.head {
height: 28px;
color: var(--text-disable-color);
border-top: none;
padding-bottom: 2px;
}
ul.detail-songlist li.head:hover {
background-color: transparent;
}
ul.detail-songlist li .title {
flex: 2;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
line-height: 17px;
max-height: 38px;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
ul.detail-songlist li.playlist-result .title {
max-height: 80px;
}
ul.detail-songlist li.playlist-result .title a {
display: flex;
align-items: center;
}
ul.detail-songlist li.playlist-result .title img {
height: 60px;
width: 60px;
display: block;
margin-right: 10px;
}
ul.detail-songlist li .artist {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
line-height: 17px;
max-height: 38px;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
ul.detail-songlist li .album {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
line-height: 17px;
max-height: 38px;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
ul.detail-songlist li .tools {
flex: 0 0 110px;
display: flex;
align-items: center;
}
ul.detail-songlist li .tools .icon {
height: 16px;
width: 16px;
color: #9d9d9d;
margin-top: 2px;
margin-right: 10px;
}
/* page song detail end */
/* page login start */
.page .login {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: calc(100vh - 192px);
}
.page .login .login-logo {
margin-bottom: 16px;
display: flex;
align-items: center;
}
.page .login .login-logo img {
height: 64px;
margin: 20px;
}
.page .login .login-title {
font-size: 18px;
margin-bottom: 10px;
}
.page .login .login-form .login-form_field {
display: flex;
align-items: center;
height: 40px;
margin: 24px;
width: 270px;
border: solid 1px var(--button-background-color);
}
.page .login .login-form .login-form_field input {
background: var(--content-background-color);
color: var(--text-default-color);
}
.page .login .login-form .login-form_field input.login-form_field_countrycode {
flex: 0 0 40px;
width: 40px;
}
.page .login .login-form .login-form_field svg {
margin-left: 12px;
margin-right: 12px;
color: var(--icon-default-color);
width: 18px;
height: 18px;
}
.page .login .login-form .login-form_field input {
border: none;
flex: 1;
font-size: 16px;
}
.page .login .login-submit_button {
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
margin-top: 24px;
padding: 8px;
width: 270px;
cursor: pointer;
border: solid 1px var(--button-border-color);
}
.page .login .login-switcher {
margin-top: 24px;
cursor: pointer;
}
.page .login .login-notice {
width: 270px;
border-top: 1px solid var(--button-border-color);
margin-top: 30px;
padding-top: 12px;
font-size: 12px;
color: var(--text-subtitle-color);
}
.page .login .usercard {
display: flex;
align-items: center;
width: 400px;
border: solid 1px var(--button-border-color);
margin-bottom: 20px;
}
.page .login .usercard img {
width: 60px;
height: 60px;
margin: 10px;
}
.page .login .usercard .usercard-title {
flex: 1;
height: 50px;
font-size: 16px;
font-weight: 700;
}
.page .login .usercard .usercard-title .usercard-info {
color: var(--link-inactive-color);
font-size: 12px;
}
.page .login .usercard button {
margin: 10px;
}
/* page login end */
/* page setting start */
.page .settings-title {
border-bottom: solid 1px var(--line-default-color);
padding-bottom: 10px;
max-width: 800px;
margin: 0 25px;
font-size: 17px;
margin-bottom: 10px;
}
.page .settings-title:first-of-type {
margin-top: 20px;
}
.page .settings-content {
margin: 0 25px 25px 25px;
}
.page .settings-content label.upload-button,
.page .settings-content .language-button {
padding: 5px;
background: var(--button-background-color);
margin-right: 4px;
color: var(--text-default-color);
cursor: pointer;
}
.page .settings-content label.upload-button:hover,
.page .settings-content .language-button:hover {
background: var(--button-hover-background-color);
}
.page .settings-content .shortcut {
display: flex;
margin-top: 10px;
}
.page .settings-content .shortcut svg {
width: 18px;
height: 18px;
margin-right: 10px;
}
.page .searchbox .search-pagination {
text-align: center;
padding: 15px;
}
.page .settings-content .shortcut_table .shortcut_table-header,
.page .settings-content .shortcut_table .shortcut_table-line {
display: flex;
color: var(--text-default-color);
box-sizing: border-box;
align-items: center;
height: 40px;
}
.page .settings-content .shortcut_table .shortcut_table-header {
color: var(--link-default-color);
height: 30px;
}
.page .settings-content .shortcut_table .shortcut_table-function {
flex: 0 140px;
padding: 0 10px;
box-sizing: border-box;
}
.page .settings-content .shortcut_table .shortcut_table-key {
flex: 0 200px;
margin-right: 20px;
box-sizing: border-box;
}
.page .settings-content .shortcut_table .shortcut_table-globalkey {
flex: 0 240px;
box-sizing: border-box;
}
.page
.settings-content
.shortcut_table
.shortcut_table-line
.shortcut_table-key {
border: solid 1px var(--button-border-color);
border-radius: 5px;
padding: 0 10px;
height: 30px;
display: flex;
align-items: center;
}
.page
.settings-content
.shortcut_table
.shortcut_table-line
.shortcut_table-globalkey {
border: solid 1px var(--button-border-color);
border-radius: 5px;
height: 30px;
padding: 0 10px;
display: flex;
align-items: center;
box-sizing: border-box;
}
.page .settings-content .custom-proxy {
margin-top: 10px;
}
.page .settings-content .custom-proxy .rule-input {
margin-top: 8px;
}
.page .settings-content .custom-proxy input {
margin-right: 15px;
height: 24px;
width: 200px;
}
.page .settings-content .search-description {
margin: 10px 0 5px 0;
}
.page .settings-content .search-source-list {
display: flex;
align-items: center;
flex-wrap: wrap;
line-height: 30px;
}
.page .settings-content .search-source-list .search-source {
display: flex;
align-items: center;
width: 130px;
}
.page .settings-content .search-source-list .search-source svg {
width: 18px;
height: 18px;
margin-right: 4px;
}
/* page setting end */
.loading_bottom {
display: block;
width: 40px;
margin: 0 auto;
}
svg.searchspinner {
width: 20px;
height: 20px;
vertical-align: top;
margin-left: 15px;
}
/* footer start */
.footer {
background: var(--foot-background-color);
height: 60px;
border-top: solid 1px var(--foot-border-color);
display: flex;
position: relative;
}
.footer .left-control {
flex: 0 0 300px;
display: flex;
align-items: center;
}
.footer .left-control .icon {
font-size: 22px;
color: var(--player-left-icon-color);
margin: 0 13px;
}
.footer .left-control .icon.play {
margin-right: 10px;
}
.footer .left-control .icon:first-of-type {
margin-left: 42px;
}
.footer .left-control .icon.play {
color: var(--player-icon-color);
}
.footer .left-control .icon.play:hover {
color: var(--player-icon-hover-color);
}
.footer .main-info {
flex: 1;
background: var(--footer-main-background-color);
display: flex;
overflow: hidden;
z-index: 1;
}
.footer .main-info .logo-banner {
text-align: center;
flex: 1;
display: flex;
align-items: center;
}
.footer .main-info .logo-banner svg.logo {
height: 48px;
width: 48px;
fill: #666666;
stroke: #666666;
margin: 0 auto;
}
.footer .main-info .cover {
height: 60px;
width: 60px;
object-fit: cover;
flex: 0 0 60px;
cursor: pointer;
position: relative;
color: #ffffff;
}
.footer .main-info .cover img {
height: 60px;
width: 60px;
object-fit: cover;
}
.footer .main-info .cover .mask {
display: none;
}
.footer .main-info .cover:hover .mask {
display: flex;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, 0.6);
position: absolute;
top: 0;
right: 0;
left: 0;
bottom: 0;
}
.footer .main-info .detail {
flex: 1;
position: relative;
overflow: hidden;
}
.footer .main-info .detail .ctrl {
position: absolute;
right: 0px;
top: 4px;
padding-right: 6px;
/* background: #eeeeee; */
}
.footer .main-info .detail .ctrl:first-of-type .icon {
margin-right: 5px;
}
.footer .main-info .detail .ctrl .icon {
color: var(--text-default-color);
opacity: 0.5;
}
.footer .main-info .detail .ctrl .icon:hover {
opacity: 1;
}
.footer .main-info .detail .title {
text-align: center;
font-size: 14px;
color: var(--text-default-color);
min-width: 0px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
margin: 3px 60px 0 60px;
}
.footer .main-info .detail .more-info {
padding: 0 10px;
display: flex;
color: var(--text-subtitle-color);
}
.footer .main-info .detail .more-info .singer {
flex: 1;
text-align: center;
font-size: 12px;
min-width: 0px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.footer .main-info .detail .more-info .singer a {
cursor: pointer;
}
.footer .main-info .detail .more-info .current {
width: 50px;
font-size: 12px;
}
.footer .main-info .detail .more-info .total {
width: 50px;
text-align: right;
font-size: 12px;
}
.footer .main-info .detail .playbar {
width: 100%;
}
.footer .main-info .detail .playbar .playbar-clickable {
padding: 8px 10px;
}
.footer .main-info .detail .playbar .barbg {
height: 3px;
background: var(--footer-player-bar-background-color);
}
.footer .main-info .detail .playbar .barbg .cur {
height: 100%;
background: var(--footer-player-bar-cur-background-color);
position: relative;
}
.footer .main-info .detail .playbar .barbg .cur .btn {
background: var(--footer-player-bar-cur-button-color);
height: 8px;
width: 2px;
position: absolute;
right: -2px;
top: -5px;
}
.footer .main-info .detail .playbar .playbar-clickable:hover .barbg .cur .btn {
width: 10px;
height: 10px;
border-radius: 5px;
top: -3px;
}
.footer .menu-modal {
left: 0;
right: 0;
top: 0;
position: fixed;
background: rgba(255, 255, 255, 0.2);
}
.footer .menu-modal.slideup {
bottom: 60px;
}
.footer .menu {
background: var(--foot-background-color);
border: solid 1px var(--foot-border-color);
border-radius: 3px;
position: fixed;
height: 370px;
bottom: -311px;
left: 300px;
right: 300px;
-webkit-app-region: no-drag;
transition: all 0.3s;
overflow: hidden;
}
.footer .menu.slideup {
bottom: 60px;
}
.footer .menu .menu-header {
height: 30px;
border-bottom: solid 1px var(--footer-header-background-color);
display: flex;
align-items: center;
color: #9e9e9e;
font-size: 12px;
}
.footer .menu .menu-header .menu-title {
flex: 1;
padding: 20px;
}
.footer .menu .menu-header .add-all {
border-right: solid 1px #e5e5e5;
flex: 0 0 auto;
display: flex;
align-items: center;
padding-right: 10px;
}
.footer .menu .menu-header .remove-all {
margin-left: 10px;
flex: 0 0 auto;
display: flex;
align-items: center;
}
.footer .menu .menu-header .close {
margin-left: 10px;
flex: 0 0 25px;
align-items: center;
cursor: pointer;
}
.footer .menu .menu-header .add-all span,
.footer .menu .menu-header .remove-all span {
cursor: pointer;
}
.footer .menu .menu-header .add-all .icon,
.footer .menu .menu-header .remove-all .icon {
margin-right: 7px;
}
.footer .menu .menu-header .close svg {
margin-right: 3px;
height: 16px;
width: 16px;
cursor: pointer;
}
.footer .menu ul.menu-list {
overflow-y: scroll;
height: 340px;
font-size: 12px;
}
.footer .menu ul.menu-list li {
display: flex;
align-items: center;
height: 30px;
padding-right: 20px;
position: relative;
margin-bottom: -2px;
border-top: solid 2px var(--songlist-border-color);
border-bottom: solid 2px var(--songlist-border-color);
}
.footer .menu ul.menu-list li.even {
background: var(--footer-menu-even-background-color);
}
.footer .menu ul.menu-list li:hover {
background: var(--footer-menu-hover-background-color);
}
.footer .menu ul.menu-list li.playing {
color: var(--important-color);
}
.footer .menu ul.menu-list li .song-status-icon {
flex: 0 0 20px;
width: 20px;
height: 30px;
text-align: center;
display: flex;
align-items: center;
}
.footer .menu ul.menu-list li .song-status-icon svg {
width: 10px;
height: 10px;
fill: var(--important-color);
stroke: var(--important-color);
flex: 1;
}
.footer .menu ul.menu-list li .song-title {
flex: 2;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.footer .menu ul.menu-list li .song-title.disabled {
color: #777777;
}
.footer .menu ul.menu-list li .song-title a {
cursor: pointer;
}
.footer .menu ul.menu-list li .song-singer {
flex: 1;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
cursor: pointer;
}
/* div.visited{
color: green;
} */
.footer .menu ul.menu-list li .tools {
flex: 0 0 42px;
width: 42px;
}
.footer .menu ul.menu-list li .tools .icon {
color: #666666;
cursor: pointer;
opacity: 0.5;
}
.footer .menu ul.menu-list li .tools .icon:first-of-type {
margin-right: 5px;
}
.footer .menu ul.menu-list li .tools .icon:hover {
opacity: 1;
}
.footer .menu ul.menu-list li .song-time {
flex: 1;
text-align: right;
}
.footer .right-control {
flex: 0 0 300px;
background: var(--foot-background-color);
display: flex;
align-items: center;
}
.footer .right-control .playlist-toggle {
margin-left: 29px;
cursor: pointer;
}
.footer .right-control .playlist-toggle .icon {
color: var(--player-right-icon-color);
}
.footer .right-control .playlist-toggle .icon:hover {
color: var(--player-right-icon-hover-color);
}
.footer .right-control .lyric-toggle {
margin-right: 30px;
cursor: pointer;
}
.footer .right-control .lyric-toggle .lyric-icon,
.footer .right-control .lyric-toggle .lyric-icon.selected:hover {
border: solid 1px #7f7f7f;
height: 16px;
line-height: 16px;
font-size: 14px;
color: #7f7f7f;
background-color: var(--lyric-icon-background-color);
user-select: none;
}
.footer .right-control .lyric-toggle .lyric-icon.selected {
border: solid 1px #7f7f7f;
background-color: #7f7f7f;
color: #fff;
}
.footer .right-control .volume-ctrl {
flex: 1;
display: flex;
}
.footer .right-control .volume-ctrl .icon {
flex: 0 0 24px;
color: var(--volume-icon-color);
cursor: pointer;
margin-left: 21px;
}
.footer .right-control .volume-ctrl .m-pbar {
flex: 1;
}
.footer .right-control .volume-ctrl .barbg {
height: 3px;
background: var(--volume-bar-background-color);
margin-top: 7px;
width: 140px;
}
.footer .right-control .volume-ctrl .barbg .cur {
height: 100%;
background: var(--volume-bar-current-background-color);
position: relative;
}
.footer .right-control .volume-ctrl .barbg .cur .btn {
background: #ffffff;
height: 13px;
width: 13px;
border: solid 1px #e4e4e4;
border-radius: 13px;
position: absolute;
right: -13px;
top: -6px;
}
/* footer end */
/* dialog start */
.shadow {
position: fixed;
background: rgba(30, 30, 30, 0.9);
_position: absolute;
z-index: 9999;
top: 0;
bottom: 0;
left: 0;
right: 0;
width: 100%;
height: 100%;
background-image: url(data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==);
}
.dialog {
position: absolute;
top: 120px;
width: 400px;
height: 430px;
z-index: 10000;
overflow: hidden;
border-radius: 4px;
background-color: var(--dialog-background-color);
color: var(--dialog-text-color);
box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
}
.dialog-header {
height: 30px;
font-size: 15px;
font-weight: bold;
text-align: left;
padding: 12px;
}
.dialog-header .dialog-close {
float: right;
font-size: 26px;
cursor: pointer;
margin-top: -10px;
}
.dialog-body {
padding: 0 20px;
height: 370px;
overflow-y: auto;
background-color: var(--dialog-background-color);
}
.dialog-body .buttons {
display: flex;
justify-content: center;
margin-top: 20px;
}
.dialog-body .buttons .confirm-button {
margin-right: 20px;
}
.dialog .detail-songlist li:hover {
background-color: #e3e3e5;
cursor: pointer;
}
.dialog-body input {
width: 100%;
}
.dialog-playlist,
.dialog-backuplist,
.dialog-merge-playlist {
padding-left: 0px;
text-align: left;
}
.dialog-playlist li,
.dialog-backuplist li,
.dialog-merge-playlist li {
cursor: pointer;
height: 48px;
padding: 6px;
}
.dialog-backuplist li {
height: 96px;
padding: 6px;
}
.dialog-playlist li:hover,
.dialog-backuplist li:hover,
.dialog-merge-playlist li:hover {
background-color: var(--dialog-highlight-color);
}
.dialog-playlist li img,
.dialog-backuplist li img,
.dialog-merge-playlist li img {
float: left;
height: 48px;
width: 48px;
}
.dialog-playlist li h2,
.dialog-backuplist li h2,
.dialog-merge-playlist li h2 {
margin: 0 0 0 58px;
font-size: 13px;
font-weight: inherit;
}
.dialog-backuplist li h2 {
margin-top: 0;
}
.dialog-newplaylist {
padding: 10px;
}
.dialog-newbackup {
text-align: center;
}
.dialog-editplaylist label,
.dialog-open-url label {
display: block;
height: 30px;
line-height: 30px;
}
.dialog-editplaylist .dialog-footer {
position: absolute;
bottom: 20px;
}
.dialog-body .field-name {
margin: 10px 0 5px 0;
}
/* dialog end */
/* widget source-list start */
.source-list {
margin: 20px 26px 10px 26px;
}
.source-list .source-button {
display: inline-block;
color: var(--link-inactive-color);
cursor: pointer;
padding-bottom: 4px;
font-size: 14px;
}
.source-list .source-button.active,
.source-list .source-button:hover {
color: var(--link-active-color);
border-bottom: solid 1px var(--link-active-color);
}
.source-list .splitter {
display: inline-block;
background: #a9a9a9;
margin-top: 1px;
height: 12px;
width: 1px;
margin: 0 10px;
}
.source-list .search-type {
float: right;
}
/* widget source-list end */
/* widget playlist-filter start */
.playlist-filter {
line-height: 38px;
margin: 0 26px 10px 26px;
}
.playlist-filter .filter-item {
line-height: 20px;
padding: 5px 15px;
margin-right: 10px;
}
.playlist-filter .filter-item.active {
font-weight: 600;
background: var(--button-hover-background-color);
}
/* widget playlist-filter end */
/* widget all-playlist-filter start */
.all-playlist-filter .category {
margin-bottom: 10px;
display: flex;
}
.all-playlist-filter .category .category-title {
margin-left: 30px;
margin-top: 12px;
min-width: 50px;
font-size: 18px;
}
.all-playlist-filter .category .category-filters {
margin-left: 10px;
display: flex;
flex-wrap: wrap;
}
.all-playlist-filter .category .category-filters .filter-item {
min-width: 80px;
margin-top: 10px;
display: flex;
}
.all-playlist-filter .category .category-filters .filter-item span {
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
padding: 5px 10px;
}
.all-playlist-filter .category .category-filters .filter-item span:hover {
background-color: var(--button-background-color);
border-radius: var(--default-border-radius);
}
/* widget all-playlist-filter end */
================================================
FILE: css/common2.css
================================================
html,
body {
margin: 0;
padding: 0;
font-size: var(--text-default-size);
color: var(--text-default-color);
font-family: system-ui, 'PingFang SC', STHeiti, sans-serif;
}
body .body{
background-color: var(--color-body-bg);
transition: background 0.2s;
border-radius: 8px;
}
a {
cursor: pointer;
color: inherit;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
.wrap {
/* https://stackoverflow.com/questions/28897089/z-index-on-borders */
outline: solid 1px var(--windows-border-color);
box-sizing: border-box;
}
/* remove focus highlight */
input:focus,
select:focus,
textarea:focus,
button:focus {
outline: none;
}
input:focus,
textarea:focus {
background-color: var(--theme-color-hover);
color: var(--theme-color);
}
ul {
list-style: none;
margin: 0;
padding: 0;
}
input,
svg,
.icon {
-webkit-app-region: no-drag;
}
button {
background-color: var(--button-background-color);
color: var(--text-default-color);
cursor: pointer;
border: solid 1px var(--button-background-color);
border-radius: var(--default-border-radius);
padding: 5px;
min-width: 80px;
min-height: 32px;
}
button:hover {
background-color: var(--button-hover-background-color);
}
img {
-webkit-user-drag: none;
object-fit: cover;
}
.l1-button {
background-color: var(--button-background-color);
color: var(--text-default-color);
border-radius: var(--default-border-radius);
padding: 5px;
margin-right: 4px;
color: var(--text-default-color);
cursor: pointer;
display: inline-block;
}
.l1-button:hover {
background: var(--button-hover-background-color);
color: var(--text-default-color);
}
svg {
width: 24px;
height: 24px;
stroke: currentColor;
stroke-width: 1;
stroke-linecap: round;
stroke-linejoin: round;
fill: none;
cursor: pointer;
/* stroke: var(--icon-default-color);*/
}
.icon {
/* default icon settings */
font-size: 16px;
cursor: pointer;
}
/* tools utils */
.flex-scroll-wrapper {
flex: 1;
height: 100px;
/* overflow-y: scroll; */
scrollbar-width: thin;
scrollbar-color: var(--scroll-color) var(--content-background-color);
}
/* scroll bar style */
::-webkit-scrollbar {
width: 8px;
background: transparent;
transition: background 0.4s;
}
::-webkit-scrollbar-thumb {
transition: background 0.4s;
width: 8px;
border-radius: 4px;
background: hsla(0, 0%, 50.2%, 0.38);
/*rgba(151, 151, 151, 0.4);*/
/* -webkit-box-shadow: inset -1px -1px 0px rgba(0, 0, 0, 0.05), inset 1px 1px 0px rgba(0, 0, 0, 0.05);*/
}
::-webkit-scrollbar-thumb:hover,
::-webkit-scrollbar-thumb:active {
background-color: hsla(0, 0%, 50.2%, 0.58);
transition: background 0.4s;
}
::-webkit-scrollbar-button {
width: 0;
height: 0;
display: none;
}
::-webkit-scrollbar-corner {
background-color: transparent;
}
/* main framework start */
.wrap {
display: flex;
height: 100vh;
flex-direction: column;
margin: auto;
}
/* split screen to up/down 2 parts */
.main {
flex: 1;
display: flex;
overflow: hidden;
}
/* split main to left/right 2 parts */
.main .sidebar {
padding-left: 1vw;
display: flex;
flex-direction: column;
}
.main .content {
flex: 1;
display: flex;
flex-direction: column;
position: relative;
}
/* split content to up/down 2 parts */
.main .content .navigation {
user-select: none;
height: 64px;
flex: 0 0 64px;
display: flex;
align-items: center;
-webkit-app-region: drag;
margin-right: 20px;
position: absolute;
top: 0;
right: 0;
left: 0;
display: flex;
justify-content: space-between;
align-items: center;
z-index: 100;
-webkit-backdrop-filter: saturate(180%) blur(20px);
backdrop-filter: saturate(180%) blur(20px);
background-color: var(--nav-background-color);
transition: background 0.2s;
}
.main .content .browser {
flex: 1;
}
/* main framework end */
/*****************************************************************/
/* main sidebar start */
.main .sidebar-content {
height: calc(100vh - 210px);
overflow: hidden;
width: 60px;
transition: 0.2s;
background: var(--sidebar-background);
border-radius: 10px;
cursor: default;
}
.main .sidebar-content.footerdef {
height: calc(100vh - 130px);
}
.main .sidebar-content.opensidebar {
width: 200px;
}
.sidebar-content .logo-content {
display: flex;
align-items: center;
justify-content: flex-start;
margin: 10px;
margin-bottom: 0;
padding-bottom: 10px;
border-bottom: 1px solid var(--sidebar-splitter);
transition: 0.2s;
cursor: pointer;
}
.sidebar-content .logo-content .logo-svg {
padding: 10px;
padding-right: 0;
transition: 0.2s;
}
.sidebar-content .logo-content .logo-title {
padding-right: 10px;
display: flex;
}
.sidebar-content .logo-content .logo-title svg {
color: var(--sidebar-splitter);
opacity: 0;
width: 0;
transition: 0.2s;
}
.opensidebar > .logo-content {
border-bottom: 1px solid transparent;
}
.opensidebar > .logo-content .logo-title svg {
opacity: 1;
width: 90px;
}
.sidebar .sidebar-scroll-content {
overflow-x: hidden;
overflow-y: overlay;
height: calc(100% - 80px);
}
.sidebar .sidebar-scroll-content::-webkit-scrollbar {
display: none;
}
.sidebar .sidebar-scroll-content::-webkit-scrollbar-thumb {
background: var(--theme-color-ope);
}
.sidebar .opensidebar > .sidebar-scroll-content:hover::-webkit-scrollbar {
display: block;
width: 2px;
}
.sidebar .menu-control {
height: 74px;
-webkit-app-region: drag;
}
.sidebar .menu-title {
height: 28px;
line-height: 28px;
margin: 8px 12px 8px 12px;
color: var(--link-default-color);
padding-left: 10px;
display: flex;
align-items: center;
font-size: 12px;
}
.sidebar .menu-title .title {
user-select: none;
white-space: nowrap;
opacity: 0;
transition: 0.2s;
width: 0;
flex: 0;
}
.sidebar .menu-title .title.opensidebar {
opacity: 1;
flex: 1;
width: auto;
}
.sidebar ul li .sidebar-block > div {
display: flex;
align-items: center;
justify-content: center;
margin-right: 10px;
}
.sidebar ul li .sidebar-block .sidebar .menu-title svg {
flex: 0 0 18px;
}
.sidebar ul li {
cursor: pointer;
padding: 2px 10px;
}
.sidebar ul li .sidebar-block {
display: flex;
align-items: center;
line-height: 28px;
padding: 6px 12px;
margin: 1px 0;
transition: all 0.2s;
color: var(--sidebar-hover-text-color);
border-radius: var(--default-border-radius);
background-color: var(--sidebar-button-background);
}
.sidebar ul li .sidebar-block.opensidebar {
background-color: transparent;
}
.sidebar svg {
width: 18px;
height: 18px;
z-index: 10;
}
.sidebar .icon {
margin-right: 10px;
font-size: 18px;
}
.sidebar ul li a {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.sidebar ul li:hover .sidebar-block {
background: var(--theme-color-hover);
color: var(--text-default-color);
border-radius: 10px;
transition: all 0.3s;
}
.sidebar ul li:hover .sidebar-block.opensidebar {
background: var(--sidebar-button-background);
}
.sidebar ul li.active .sidebar-block,
.sidebar ul li.active:hover .sidebar-block {
background: var(--theme-color);
color: #fff;
border-radius: 10px;
}
.sidebar ul li.dragover .sidebar-block {
background: var(--sidebar-highlight-background-color);
color: var(--text-default-color);
border-radius: 10px;
}
/*
avoid hover effect trigger dragleave event
https://stackoverflow.com/questions/19889615/can-an-angular-directive-pass-arguments-to-functions-in-expressions-specified-in
*/
.sidebar ul li * {
pointer-events: none;
}
/* main sidebar end */
/* widget navigation start */
.navigation svg {
width: 24px;
height: 24px;
}
.navigation .icon svg {
color: var(--text-default-color);
}
.navigation .backfront {
flex: 0 0 45px;
line-height: 46px;
vertical-align: middle;
padding: 0 13px;
flex: 1;
}
.navigation .search {
display: flex;
width: 200px;
height: 32px;
background: var(--search-input-background-color);
border-style: none;
border-radius: var(--default-border-radius);
padding-left: 10px;
margin-right: 20px;
align-items: center;
}
.navigation .settings {
margin-right: 8px;
}
.navigation .settings.is-setting {
display: flex;
justify-content: center;
align-items: center;
padding: 8px;
margin-right: 1vw;
transition: 0.2s;
}
.navigation .settings.is-setting:hover {
opacity: 1;
background-color: var(--songlist-hover-background-color);
border-radius: 25%;
}
.navigation .settings.is-setting:hover svg {
color: var(--text-default-color);
}
.navigation .icon {
color: var(--text-default-color);
background-color: transparent;
/* opacity: 0.5; */
display: flex;
align-items: center;
justify-content: center;
padding: 8px;
border-radius: 25%;
transition: 0.2s;
}
.navigation .icon img {
border-radius: 50%;
width: 30px;
height: 30px;
}
.navigation .icon:hover {
opacity: 1;
background-color: var(--songlist-hover-background-color);
}
.navigation .backfront .icon {
display: inline-block;
vertical-align: middle;
}
.navigation .backfront .icon:nth-of-type(1) {
margin-right: 8px;
}
.navigation .search-input {
width: 174px;
background-color: transparent;
border-style: none;
font-size: 16px;
font-weight: 600;
color: var(--text-default-color);
}
.navigation .window-control {
display: flex;
}
.navigation .window-control svg {
margin-left: 8px;
}
.navigation .window-control svg:first-of-type {
margin-left: 15px;
}
/* navigation end */
/* page hot-playlist start */
.playlist-covers,
.detail-songlist.isSearch {
padding-right: 2vw;
padding-top: 30px;
display: flex;
flex-flow: row wrap;
position: relative;
margin: 0 14px;
grid-template-columns: repeat(5, 1fr);
gap: 40px 0px;
}
.playlist-covers {
transition: padding 0.3s;
}
.playlist-covers li {
color: var(--text-default-color);
margin: 0 12px;
}
@media screen and (max-width:1000px){
.playlist-covers li {
flex: 0 1 calc(25% - 26px);
}
}
@media screen and (min-width:1000px) and (max-width:1480px){
.playlist-covers li {
flex: 0 1 calc(20% - 26px);
}
}
@media screen and (min-width:1480px){
.playlist-covers li {
flex: 0 1 calc(16.66% - 26px);
}
}
.playlist-covers .u-cover,
ul.detail-songlist li .u-cover {
display: flex;
position: relative;
justify-content: center;
align-items: center;
user-select: none;
}
.playlist-covers .u-cover img,
ul.detail-songlist li .u-cover img {
transition: all 0.1s ease-in-out 0s;
box-sizing: border-box;
width: 100%;
border-radius: 0.75em;
/* min-width: 136px;
max-width: 100%; */
object-fit: cover;
border: solid 1px rgba(0, 0, 0, 0.04);
cursor: pointer;
z-index: 1;
}
.playlist-covers .u-cover .bottom,
.detail-head-cover .bottom,
ul.detail-songlist li .u-cover .bottom {
position: absolute;
z-index: 2;
cursor: pointer;
opacity: 0;
transition: all 0.2s ease 0s;
display: flex;
align-items: center;
justify-content: center;
color: rgb(255, 255, 255);
backdrop-filter: blur(8px);
background: hsla(0, 0%, 100%, 0.14);
border: 1px solid hsla(0, 0%, 100%, 0.08);
height: 22%;
width: 22%;
border-radius: 50%;
}
.playlist-covers .u-cover .covershadow,
.detail-head-cover .covershadow,
ul.detail-songlist li .u-cover .covershadow {
transition: all 0.4s;
opacity: 0;
position: absolute;
top: 12px;
height: 100%;
width: 100%;
filter: blur(16px) opacity(0.6);
transform: scale(0.92, 0.96);
z-index: 0;
background-size: cover;
border-radius: 0.75em;
}
.playlist-covers .u-cover:hover img,
ul.detail-songlist li .u-cover:hover img {
margin-top: -10px;
margin-bottom: 10px;
padding-bottom: 0;
}
.playlist-covers .u-cover:hover .covershadow,
ul.detail-songlist li .u-cover:hover .covershadow {
display: block;
opacity: 1;
}
.playlist-covers .u-cover:hover .bottom,
.detail-head-cover:hover .bottom,
ul.detail-songlist li .u-cover:hover .bottom {
opacity: 1;
}
.playlist-covers .u-cover:hover .bottom:hover,
.detail-head-cover:hover .bottom:hover,
ul.detail-songlist li .u-cover .bottom:hover {
background: hsla(0, 0%, 100%, 0.28);
}
.playlist-covers .u-cover .bottom svg,
ul.detail-songlist li .u-cover .bottom svg {
height: 30px;
width: 30px;
fill: rgba(200, 200, 200, 0.5);
stroke-width: 1;
stroke: #ffffff;
}
.playlist-covers .u-cover .bottom svg:hover,
ul.detail-songlist li .u-cover .bottom svg:hover {
fill: rgba(100, 100, 100, 0.5);
}
.playlist-covers .desc,
ul.detail-songlist li .desc {
cursor: default;
padding-top: 8px;
height: 65px;
}
.playlist-covers .desc .title,
ul.detail-songlist li .desc div.title {
word-break: break-all;
font-size: 16px;
font-weight: 600;
line-height: 20px;
word-break: break-all;
display: flex;
margin: 0 0 5px;
z-index: 1;
text-overflow: ellipsis;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
display: -webkit-box;
text-decoration: none;
overflow: hidden;
}
/* .playlist-covers .desc .title:hover,
ul.detail-songlist li .desc div.title:hover{
text-decoration: underline;
} */
/* page hot-playlist end */
/* page playlist-detail start */
.page .playlist-detail {
padding-bottom: 37px;
}
.page .playlist-detail .detail-head {
display: flex;
margin-top: 11px;
margin-bottom: 72px;
}
.page .playlist-detail .detail-head img {
position: relative;
z-index: 1;
height: 100%;
width: 100%;
border-radius: 0.75em;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
aspect-ratio: 1/1;
}
.page .playlist-detail .detail-head .covershadow {
transition: all 0.4s;
opacity: 0;
position: absolute;
top: 12px;
height: 100%;
width: 100%;
filter: blur(16px) opacity(0.6);
transform: scale(0.92, 0.96);
z-index: 0;
background-size: cover;
border-radius: 0.75em;
}
.page .playlist-detail .detail-head .detail-head-cover {
position: relative;
margin-left: 2vw;
display: flex;
justify-content: center;
align-items: center;
z-index: 1;
height: 25vh;
width: 25vh;
}
.page .playlist-detail .detail-head .detail-head-title {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
margin-left: 56px;
margin-right: 2vw;
}
.page .playlist-detail .detail-head .detail-head-title h2 {
font-size: 36px;
font-weight: 700;
margin-top: 10px;
}
.playlist-button-list {
display: flex;
flex-flow: row wrap;
}
.playlist-button-list .playlist-button {
margin-top: 10px;
height: 26px;
cursor: pointer;
display: flex;
margin-right: 16px;
border-radius: 8px;
padding: 8px 16px;
width: auto;
background-color: var(--button-background-color);
}
.playlist-button-list .playlist-button.favorited {
background-color: var(--theme-color-hover);
color: var(--theme-color);
}
.playlist-button-list .playlist-button.playadd-button {
flex: 0 0 136px;
}
.playlist-button-list .playlist-button .play-list {
flex: 1;
display: flex;
align-items: center;
font-size: 17px;
line-height: 17px;
font-weight: 500;
user-select: none;
}
.playlist-button-list .playlist-button .play-list svg {
margin-right: 4px;
}
.playlist-button-list .playlist-button.playadd-button .play-list svg {
width: 14px;
height: 14px;
flex: 0 0 14px;
margin-right: 4px;
stroke: var(--important-color);
fill: var(--important-color);
}
.playlist-button-list .playlist-button .play-list .icon {
margin-right: 8px;
}
.playlist-button-list .playlist-button.playadd-button .play-list .icon {
flex: 0 0 14px;
margin-right: 4px;
color: var(--important-color);
transition: 0.2s;
}
.playlist-button-list .playlist-button.playadd-button .add-list {
flex: 0 0 26px;
height: 26px;
width: 26px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: 0.2s;
font-size: 17px;
line-height: 17px;
font-weight: 500;
}
.playlist-button-list .playlist-button.edit-button .play-list.favorited {
color: var(--text-default-color);
}
.playlist-button-list .playlist-button.edit-button .play-list.notfavorite {
color: var(--text-default-color);
}
.playlist-button-list .playlist-button:hover,
.playlist-button-list .playlist-button.playadd-button .add-list:hover,
.playlist-button-list .playlist-button.playadd-button .play-list:hover {
transform: scale(1.1);
transition: 0.2s;
}
.playlist-button-list .playlist-button.playadd-button .add-list svg {
width: 14px;
height: 14px;
}
.playlist-button-list .playlist-button.clone-button,
.playlist-button-list .playlist-button.edit-button,
.playlist-button-list .playlist-button.fav-button {
flex: 0 0 auto;
}
.playlist-button-list .playlist-button.clone-button .play-list svg,
.playlist-button-list .playlist-button.edit-button .play-list svg,
.playlist-button-list .playlist-button.fav-button .play-list svg {
width: 16px;
height: 16px;
flex: 0 0 16px;
margin-right: 8px;
stroke: rgb(102, 102, 102);
}
.playlist-button-list .playlist-button.fav-button .play-list.favorited svg {
fill: rgb(102, 102, 102);
}
/* page playlist detail end */
/* page song detail start */
.songdetail-wrapper {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 100px;
overflow: hidden;
-webkit-app-region: no-drag;
transition: all 0.5s;
z-index: 100;
opacity: 1;
}
.songdetail-wrapper .draggable-zone {
position: absolute;
left: 0;
top: 0;
right: 0;
-webkit-app-region: drag;
height: 80px;
}
.songdetail-wrapper.slidedown .draggable-zone {
display: none;
-webkit-app-region: no-drag;
}
.songdetail-wrapper.slidedown {
top: calc(100% - 100px);
/* opacity: 0; */
}
.songdetail-wrapper .close {
position: absolute;
top: 24px;
left: 24px;
height: 19px;
width: 19px;
cursor: pointer;
padding: 5px;
border-radius: 50%;
-webkit-app-region: no-drag;
transition: 0.2s;
z-index: 100;
}
.songdetail-wrapper .close:hover {
background-color: var(--songlist-hover-background-color);
}
.songdetail-wrapper .close.mac {
top: 44px;
}
.songdetail-wrapper .window-control {
position: absolute;
top: 24px;
right: 24px;
height: 24px;
cursor: pointer;
-webkit-app-region: no-drag;
z-index: 99;
}
.songdetail-wrapper .window-control svg {
margin-left: 8px;
stroke: var(--now-playing-close-icon-color);
}
.songdetail-wrapper .close svg {
stroke: var(--now-playing-close-icon-color);
}
.bgwrapper {
overflow: hidden;
border-radius: 10px;
width: 100%;
}
.bg {
opacity: 0.6;
width: 100%;
height: 100%;
filter: blur(200px) contrast(75%) brightness(150%);
float: left;
background-repeat: no-repeat;
background-position: center;
background-size: cover;
transition: background ease-in-out 1.5s;
}
.playsong-detail {
position: absolute;
top: 0;
right: 0;
left: 0;
bottom: 0;
display: flex;
clip: rect(auto, auto, auto, auto);
}
.playsong-detail .detail-head {
flex: 1;
display: flex;
justify-content: flex-end;
margin-right: 32px;
margin-top: 24px;
align-items: center;
transition: all 0.5s;
z-index: 1;
}
.playsong-detail .detail-head-cover {
position: relative;
}
.playsong-detail .detail-head img {
border-radius: 10px;
width: 54vh;
height: 54vh;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-o-object-fit: cover;
object-fit: cover;
}
.playsong-detail .detail-songinfo {
flex: 1;
font-weight: 600;
color: var(--color-text);
margin-right: 24px;
z-index: 0;
}
.playsong-detail .detail-head-title {
max-width: 54vh;
margin-top: 24px;
}
.playsong-detail .title {
display: flex;
align-items: center;
}
.playsong-detail .title h2 {
font-size: var(--h2-title-font-size);
margin-top: 8px;
margin-bottom: 0;
font-weight: 600;
opacity: 0.88;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
overflow: hidden;
}
.playsong-detail .title .badge {
font-size: var(--badge-font-size);
color: var(--theme-color);
border: solid 1px var(--theme-color);
border-radius: 5px;
margin-left: 10px;
padding-left: 4px;
padding-right: 4px;
margin-top: 4px;
box-sizing: border-box;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
white-space: nowrap;
}
.playsong-detail .title .badge.platform {
padding-top: 1px;
}
.playsong-detail .title .badge:first-of-type {
margin-left: 15px;
}
.playsong-detail .info {
margin-top: 4px;
font-size: 16px;
opacity: 0.58;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
overflow: hidden;
}
.playsong-detail .info .singer {
display: inline;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.playsong-detail .info .album {
display: inline;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.coverbg .playsong-detail .info span {
color: var(--lyric-on-cover-color);
}
.playsong-detail .detail-songinfo .lyric {
font-size: 16px;
height: 100%;
display: flex;
flex-direction: column;
padding-left: 78px;
max-width: 460px;
overflow-y: auto;
transition: 0.5s;
color: var(--lyric-default-color);
}
.playsong-detail .detail-songinfo .lyric::-webkit-scrollbar {
display: none;
}
.coverbg .playsong-detail .detail-songinfo .lyric {
color: var(--lyric-on-cover-color);
}
.playsong-detail .detail-songinfo .lyric .placeholder {
margin-top: 50vh;
}
.playsong-detail .detail-songinfo .lyric p {
padding: 18px;
transition: all 0.2s;
border-radius: 12px;
margin: 0;
opacity: 0.28;
cursor: default;
background: transparent;
color: var(--text-default-color);
}
.playsong-detail .detail-songinfo .lyric p:hover {
background: hsla(0, 0%, 100%, 0.08);
opacity: 0.6;
color: var(--text-default-color);
}
.playsong-detail .detail-songinfo .lyric p.translate {
margin: 5px 0 0 0;
}
.playsong-detail .detail-songinfo .lyric p.hide {
display: none;
}
.playsong-detail .detail-songinfo .lyric p.highlight {
color: var(--text-default-color);
opacity: 1;
font-size: 26px;
}
.coverbg .playsong-detail .detail-songinfo .lyric p.highlight {
color: var(--lyric-important-on-cover-color);
opacity: 1;
}
ul.detail-songlist {
position: relative;
}
.detail-songlist.playlist-songlist {
margin: 0 2vw;
padding-top: 13px;
transition: 0.3s;
}
ul.detail-songlist.isSearchOne {
padding: 0 25px;
}
ul.detail-songlist .playlist-search {
position: absolute;
right: 0;
top: -50px;
display: flex;
width: 200px;
height: 32px;
background: var(--songlist-odd-background-color);
border-style: none;
border-radius: var(--default-border-radius);
padding-left: 10px;
margin-right: 40px;
align-items: center;
}
ul.detail-songlist .playlist-search .playlist-search-icon {
width: 14px;
position: absolute;
left: 7px;
top: 1px;
}
ul.detail-songlist .playlist-search .playlist-clear-icon {
width: 14px;
position: absolute;
left: 158px;
}
ul.detail-songlist .playlist-search .playlist-search-input {
width: 174px;
background-color: transparent;
border-style: none;
font-size: 16px;
font-weight: 600;
color: var(--text-default-color);
}
ul.detail-songlist .playlist-search:hover,
ul.detail-songlist .playlist-search:active {
background-color: var(--search-input-background-color);
}
ul.detail-songlist li.isSearchType {
/* https://stackoverflow.com/questions/4157005/css-positioning-z-index-negative-margins */
position: relative;
transition: all 0.3s;
display: flex;
align-items: center;
padding: 8px;
border-radius: 12px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
ul.detail-songlist li.isSearchGeDan {
flex: 0 1 calc(20% - 26px);
min-height: 156px;
color: var(--text-default-color);
margin: 0 12px;
cursor: default;
}
ul.detail-songlist li.playlist-result.isSearchType {
height: 80px;
padding: 0 10px;
}
ul.detail-songlist li > img {
object-fit: cover;
border-radius: 8px;
height: 46px;
width: 46px;
margin-right: 20px;
border: 1px solid rgba(0, 0, 0, 0.04);
cursor: pointer;
}
ul.detail-songlist li.isSearchType:hover {
background-color: var(--songlist-hover-background-color);
}
ul.detail-songlist li.isSearchType.playing,
ul.detail-songlist li.isSearchType.playing:hover {
background-color: var(--theme-color-hover);
color: var(--theme-color);
}
ul.detail-songlist li .title-and-artist {
flex: 1;
display: flex;
}
ul.detail-songlist li .container {
display: flex;
flex-direction: column;
}
ul.detail-songlist li a {
cursor: pointer;
}
ul.detail-songlist li a.disabled {
color: var(--disable-song-title-color);
}
ul.detail-songlist li a span.source,
ul.detail-songlist span {
border: solid 1px #ccc;
border-radius: 4px;
margin-right: 10px;
display: inline-block;
padding: 0 4px;
color: #ccc;
font-size: 12px;
width: 24px;
text-align: center;
white-space: nowrap;
height: min-content;
}
ul.detail-songlist li a span.source.playlist {
margin-left: 10px;
margin-right: 0;
}
ul.detail-songlist li .title {
font-size: 18px;
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
word-break: break-all;
}
ul.detail-songlist li.playlist-result .title {
max-height: 80px;
}
ul.detail-songlist li.playlist-result .title img {
height: 60px;
width: 60px;
display: block;
margin-right: 10px;
}
ul.detail-songlist li .artist {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
/* line-height: 17px;
max-height: 38px; */
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
font-size: 13px;
margin-top: 2px;
font-size: 13px;
opacity: 0.68;
}
ul.detail-songlist li .album {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
/* line-height: 17px;
max-height: 38px; */
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
display: flex;
font-size: 16px;
opacity: 0.88;
}
ul.detail-songlist li .tools {
flex: 0 0 110px;
display: flex;
align-items: center;
}
ul.detail-songlist li .tools a:hover {
color: var(--text-default-color) !important;
}
ul.detail-songlist li .tools .icon {
height: 16px;
width: 16px;
color: #9d9d9d;
margin-top: 2px;
margin-right: 10px;
}
/* page song detail end */
/* page login start */
.page .login {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: calc(100vh - 192px);
}
.page .login .login-logo {
margin-bottom: 16px;
display: flex;
align-items: center;
}
.page .login .login-logo img {
height: 64px;
margin: 20px;
}
.page .login .login-title {
font-size: 18px;
margin-bottom: 10px;
}
.page .login .login-form .login-form_field {
display: flex;
align-items: center;
height: 40px;
margin: 24px;
width: 270px;
border: solid 1px var(--button-background-color);
}
.page .login .login-form .login-form_field input {
background: var(--content-background-color);
color: var(--text-default-color);
}
.page .login .login-form .login-form_field input.login-form_field_countrycode {
flex: 0 0 40px;
width: 40px;
}
.page .login .login-form .login-form_field svg {
margin-left: 12px;
margin-right: 12px;
color: var(--icon-default-color);
width: 18px;
height: 18px;
}
.page .login .login-form .login-form_field input {
border: none;
flex: 1;
font-size: 16px;
}
.page .login .login-form .login-form_field input:focus {
background-color: var(--theme-color-hover);
color: var(--theme-color);
}
.page .login .login-submit_button {
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
margin-top: 24px;
padding: 8px;
width: 270px;
cursor: pointer;
border: solid 1px var(--button-border-color);
}
.page .login .login-switcher {
margin-top: 24px;
cursor: pointer;
}
.page .login .login-notice {
width: 270px;
border-top: 1px solid var(--button-border-color);
margin-top: 30px;
padding-top: 12px;
font-size: 12px;
color: var(--text-subtitle-color);
}
.page .login .usercard {
padding: 20px;
display: flex;
align-items: center;
width: 400px;
background-color: var(--button-background-color);
margin-bottom: 20px;
border-radius: 10px;
cursor: pointer;
transition: all 0.3s;
}
.page .login .usercard .logoin-icon {
width: 60px;
height: 60px;
margin: 10px;
display: flex;
justify-content: center;
align-items: center;
}
.page .login .usercard .logoin-icon svg {
width: 35px;
height: 35px;
}
.page .login .usercard:hover,
.page .login .usercard:active {
background-color: var(--theme-color-hover);
color: var(--theme-color);
width: 500px;
}
.page .login .usercard:hover .usercard-info,
.page .login .usercard:active .usercard-info {
color: var(--theme-color);
}
.page .login .usercard img {
border-radius: 10px;
width: 60px;
height: 60px;
margin: 10px;
}
.page .login .usercard .usercard-title {
margin-left: 10px;
flex: 1;
height: 50px;
font-size: 18px;
font-weight: 700;
}
.page .login .usercard .usercard-title .usercard-info {
color: var(--text-subtitle-color);
font-size: 12px;
}
.page .login .usercard button {
margin: 10px;
margin: 10px;
font-size: 14px;
font-weight: 600;
padding: 8px 16px;
transition: 0.2s;
}
.page .login .usercard button:hover {
background-color: var(--theme-color-hover);
color: var(--theme-color);
}
/* page login end */
/* page setting start */
.page .settings-title {
max-width: 800px;
margin: 0 auto;
padding: 0 20px;
font-weight: bold;
padding-bottom: 12px;
font-size: 26px;
user-select: none;
border-bottom: 1px solid rgba(128, 128, 128, 0.18);
}
.page .settings-content {
max-width: 800px;
margin: 25px auto;
padding: 0 20px;
font-size: 16px;
font-weight: 500;
opacity: 0.78;
}
.page .settings-content label.upload-button,
.page .settings-content .language-button,
.page .settings-content .theme-button,
.page .settings-content button {
background: var(--button-background-color);
margin-right: 4px;
color: var(--text-default-color);
cursor: pointer;
opacity: 1;
font-weight: 600;
border: none;
padding: 8px 12px;
border-radius: 8px;
appearance: none;
transition: all 0.2s;
}
.page .settings-content label.upload-button:hover,
.page .settings-content .language-button:hover,
.page .settings-content button:hover {
transform: scale(1.1);
background: var(--button-hover-background-color);
}
.page .settings-content .shortcut {
display: flex;
margin-bottom: 25px;
}
.page .settings-content .shortcut svg {
width: 18px;
height: 18px;
margin-right: 10px;
}
.page .searchbox .search-pagination {
text-align: center;
padding: 32px;
}
.page .searchbox .search-pagination .btn-pagination {
padding: 8px 16px;
width: auto;
height: 40px;
min-width: 40px;
font-size: 18px;
line-height: 18px;
font-weight: 600;
transition: 0.2s all;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
opacity: 0.78;
}
.page .searchbox .search-pagination .ng-binding {
font-size: 18px;
line-height: 18px;
font-weight: 600;
padding: 0 20px;
}
.page .settings-content .shortcut_table .shortcut_table-header,
.page .settings-content .shortcut_table .shortcut_table-line {
display: flex;
color: var(--text-default-color);
box-sizing: border-box;
align-items: center;
height: 40px;
}
.page .settings-content .shortcut_table .shortcut_table-header {
color: var(--link-default-color);
height: 30px;
}
.page .settings-content .shortcut_table .shortcut_table-function {
flex: 0 140px;
padding: 0 10px;
box-sizing: border-box;
}
.page .settings-content .shortcut_table .shortcut_table-key {
flex: 0 200px;
margin-right: 20px;
box-sizing: border-box;
}
.page .settings-content .shortcut_table .shortcut_table-globalkey {
flex: 0 240px;
box-sizing: border-box;
}
.page
.settings-content
.shortcut_table
.shortcut_table-line
.shortcut_table-key {
border: solid 1px var(--button-border-color);
border-radius: 5px;
padding: 0 10px;
height: 30px;
display: flex;
align-items: center;
}
.page
.settings-content
.shortcut_table
.shortcut_table-line
.shortcut_table-globalkey {
border: solid 1px var(--button-border-color);
border-radius: 5px;
height: 30px;
padding: 0 10px;
display: flex;
align-items: center;
box-sizing: border-box;
}
.page .settings-content .custom-proxy {
margin-top: 10px;
}
.page .settings-content .custom-proxy .rule-input {
margin-top: 8px;
}
.page .settings-content .custom-proxy input {
margin-right: 15px;
height: 24px;
width: 200px;
}
.page .settings-content .custom-proxy input:focus {
background-color: var(--theme-color-hover);
color: var(--theme-color);
}
.page .settings-content .search-description,
.page .settings-content p {
margin: 0 0 25px 0;
}
.page .settings-content .search-source-list {
display: flex;
align-items: center;
flex-wrap: wrap;
line-height: 30px;
}
.page .settings-content .search-source-list .search-source {
display: flex;
align-items: center;
width: 130px;
}
.page .settings-content .search-source-list .search-source svg {
width: 18px;
height: 18px;
margin-right: 4px;
}
/* page setting end */
.loading_bottom {
display: block;
width: 40px;
margin: 0 auto;
}
svg.searchspinner {
width: 20px;
height: 20px;
vertical-align: top;
margin-left: 15px;
}
/* footer start */
.footer {
height: 100px;
display: flex;
align-items: flex-end;
z-index: 130;
margin: 1vh 1vw;
border-radius: 10px;
position: fixed;
bottom: 0;
width: 98vw;
transition: 0.5s;
color: var(--text-default-color);
}
.footer.footerdef {
opacity: 0;
bottom: -140px;
transition: 0.5s;
}
.footer .footer-main {
position: relative;
z-index: 140;
height: 100px;
border-radius: 10px;
display: flex;
flex: 1;
transition: 0.5s;
backdrop-filter: saturate(180%) blur(20px);
background-color: var(--nav-background-color);
border: 1px solid rgba(255, 255, 255, 0.08);
box-shadow: 0px 0px 16px rgb(0 0 0 / 10%);
border-top: solid 1px var(--line-default-color);
}
.footer .footer-main.slidedown {
height: calc(98vh - 2px);
}
.footer .footerwrap {
width: 100%;
display: flex;
height: 100px;
position: absolute;
bottom: 0;
}
.footer .left-control {
flex: 0 0 36%;
display: flex;
align-items: center;
overflow: hidden;
transition: 0.5s;
opacity: 1;
}
.footer .left-control.slidedown {
flex: 0 0 0;
opacity: 0;
transform: scaleX(0);
}
.footer .left-control .icon {
display: flex;
font-size: 22px;
border-radius: 10px;
padding: 7px;
margin: 37px;
transition: all 0.3s;
background: transparent;
}
.footer .left-control .icon:hover {
background-color: var(--songlist-hover-background-color);
}
.footer .left-control .icon.playlistactive {
background-color: var(--theme-color-hover);
color: var(--theme-color);
}
.footer .left-control .splitter {
height: 20px;
width: 1px;
display: inline-block;
background: #a9a9a9;
}
.footer .left-control .icon.play {
margin-right: 10px;
}
.footer .left-control .icon.play {
color: var(--player-icon-color);
}
.footer .left-control .icon.play:hover {
color: var(--player-icon-hover-color);
}
.footer .main-info {
flex: 1;
display: flex;
z-index: 1;
justify-content: center;
align-items: center;
flex-direction: column;
z-index: 110;
}
.footer .main-info .logo-banner {
text-align: center;
flex: 1;
display: flex;
align-items: center;
}
.footer .main-info .logo-banner svg.logo {
height: 48px;
width: 48px;
fill: #666666;
stroke: #666666;
margin: 0 auto;
}
.footer .circlemark {
display: flex;
justify-content: center;
width: 100px;
height: 50px;
position: absolute;
top: 45px;
z-index: -1;
overflow: hidden;
transform-origin: top center;
}
.rotatemark {
animation: rotatemark 1s 1 forwards ease-in-out;
}
.circlmark {
animation: circlmark 1s 1 forwards ease-in-out;
}
.rotatecircl {
animation: rotatecircl 16s 0.5s infinite forwards linear;
}
.lipause {
animation-play-state: paused;
}
.liplay {
animation-play-state: running;
}
/* .circlopacity{
animation:circlopacity 1s forwards;
} */
@keyframes rotatemark {
0% {
transform-origin: top center;
transform: rotate(0deg);
}
50% {
transform-origin: top center;
transform: rotate(180deg);
}
100% {
transform-origin: top center;
transform: rotate(360deg);
}
}
@keyframes circlmark {
0% {
transform: rotate(0deg);
}
50% {
transform: rotate(180deg);
}
100% {
transform: rotate(360deg);
}
}
/* @keyframes circlopacity{
0%{
opacity: 1;
}
50%{
opacity: 0;
}
100%{
opacity: 1;
}
} */
@keyframes rotatecircl {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.footer .cover {
height: 90px;
width: 90px;
object-fit: cover;
position: relative;
color: transparent;
top: -30px;
display: flex;
justify-content: center;
}
.footer .cover ul,
.footer .cover .cover-list {
width: 220px;
height: 90px;
position: absolute;
}
.footer .cover .cover-list span {
bottom: 0;
cursor: pointer;
transition: 0.3s;
color: var(--white--black);
display: flex;
justify-content: center;
align-items: center;
opacity: 0;
}
.footer .cover .cover-list span:hover,
.footer .cover .cover-list span.show {
opacity: 1;
background-color: var(--white--black-background);
}
.footer .cover li {
transition: all 0.3s;
left: 0;
bottom: 0;
height: 45px;
width: 30px;
}
.footer .cover li.hid {
opacity: 0;
z-index: -1;
height: 45px;
width: 32px;
display: none;
float: left;
position: absolute;
overflow: hidden;
transition: all 0.3s;
border-radius: 16px;
left: 0;
bottom: 0;
}
.footer .cover li.def {
display: block;
}
.footer .cover ul .a,
.footer .cover-list .a {
height: 45px;
width: 32px;
left: 0;
position: absolute;
overflow: hidden;
border-radius: 16px;
opacity: 1;
z-index: 100;
display: block;
}
.footer .cover ul .b,
.footer .cover-list .b {
height: 90px;
width: 90px;
left: 65px;
position: absolute;
overflow: hidden;
border-radius: 50%;
opacity: 1;
z-index: 101;
display: block;
}
.footer .cover ul .c,
.footer .cover-list .c {
height: 45px;
width: 32px;
left: 190px;
position: absolute;
overflow: hidden;
border-radius: 16px;
opacity: 1;
z-index: 99;
display: block;
}
.footer .cover img {
height: 100%;
width: 100%;
object-fit: cover;
/* border-radius: 50%; */
/* position: absolute; */
/* border: 1px solid transparent; */
box-sizing: border-box;
}
.footer .cover .circle {
width: 100px;
height: 100px;
position: relative;
top: -50px;
z-index: -1;
overflow: hidden;
transition: all 0.1s linear;
}
.footer .circlemark .topmark {
width: 100px;
height: 50px;
/* position: absolute; */
z-index: -1;
overflow: hidden;
}
.footer .cover .top {
width: 96px;
height: 96px;
z-index: -1;
border-radius: 50%;
border: 2px solid;
border-color: var(--text-default-color);
}
.footer .cover .bottom {
width: 100px;
height: 50px;
/* position: absolute; */
overflow: hidden;
}
.footer .cover .bottom .bottomcircle {
width: 96px;
height: 96px;
transform: translateY(-50px);
z-index: -1;
border-radius: 50%;
border: 2px solid;
border-color: var(--footer-player-bar-background-color);
}
.footer .footertime {
padding-bottom: 15px;
font-size: 12px;
flex: 0;
cursor: default;
font-weight: 500;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
transition: 0.3s;
width: 100%;
max-width: 30vw;
}
.footer .footertime:hover {
padding: 0;
}
.footer .footertime:hover .timeswitch {
display: none;
}
.footer .footertime:hover .bottomprogressbar {
display: flex;
}
.footer .left-control .detail {
max-width: 356px;
margin-left: 37px;
position: relative;
overflow: hidden;
display: flex;
flex-direction: column;
justify-content: center;
}
.footer .left-control .detail .ctrl {
position: absolute;
right: 0px;
top: 4px;
padding-right: 6px;
}
.footer .left-control .detail .ctrl:first-of-type .icon {
margin-right: 5px;
}
.footer .left-control .detail .ctrl .icon {
color: var(--text-default-color);
opacity: 0.5;
}
.footer .left-control .detail .ctrl .icon:hover {
opacity: 1;
}
.footer .left-control .detail .title {
font-size: 14px;
color: var(--text-default-color);
min-width: 0px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
margin: 5px 0;
font-size: 18px;
font-weight: 600;
}
.footer .left-control .detail .more-info {
margin: 5px 0;
display: flex;
color: var(--text-subtitle-color);
}
.footer .left-control .detail .more-info .singer {
flex: 1;
font-size: 12px;
min-width: 0px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.footer .left-control .detail .more-info .singer a {
cursor: pointer;
}
.footer .left-control .detail .more-info .current {
width: 50px;
font-size: 12px;
}
.footer .left-control .detail .more-info .total {
width: 50px;
text-align: right;
font-size: 12px;
}
.footer .main-info .bottomprogressbar svg {
cursor: default;
}
.footer .main-info .volume-ctrl .icon svg {
cursor: pointer;
}
.footer .main-info .bottomprogressbar {
justify-content: center;
align-items: center;
flex-wrap: nowrap;
width: 100%;
display: none;
}
.footer .main-info .playbar {
display: flex;
justify-content: center;
align-items: center;
width: 50%;
}
.footer .main-info .playbar .playbar-clickable {
margin: 5px 10px 5px 0;
padding: 5px 0;
flex: 1;
cursor: pointer;
}
.footer .main-info .barbg {
height: 3px;
background: var(--footer-player-bar-background-color);
}
.footer .main-info .barbg .cur {
height: 100%;
background: var(--footer-player-bar-cur-background-color);
position: relative;
}
.footer .main-info .playbar .playbar-clickable:hover .cur,
.footer .main-info .m-pbar:hover .barbg .cur {
background: var(--theme-color);
}
.footer .main-info .barbg .cur .btn {
background: var(--footer-player-bar-cur-button-color);
height: 8px;
width: 2px;
position: absolute;
right: -2px;
top: -5px;
transition: 0.3s;
}
.footer .main-info .playbar .playbar-clickable:hover .barbg .cur .btn,
.footer .main-info .m-pbar:hover .barbg .cur .btn {
width: 10px;
height: 10px;
border-radius: 5px;
top: -3px;
}
.volume-ctrl {
width: 50%;
display: flex;
justify-content: center;
align-items: center;
}
.bottomprogressbar .icon {
flex: 0 0 24px;
color: var(--text-default-color);
cursor: default;
padding: 7px;
display: flex;
}
.volume-ctrl .m-pbar {
flex: 1;
margin: 5px 0;
padding: 5px 0;
cursor: pointer;
}
.footer .menu-modal {
border-radius: 10px;
transition: 0.3s;
left: 0;
right: 0;
top: 0;
position: fixed;
opacity: 0;
background: var(--shadow-mask);
}
.footer .menu-modal.slideup {
bottom: 0px;
opacity: 1;
transition: 0.3s;
}
.footer .menu {
border-radius: 10px;
position: absolute;
z-index: 120;
bottom: 120px;
height: 0;
opacity: 0;
box-sizing: border-box;
border: 1px solid var(--white--black);
left: 0;
-webkit-app-region: no-drag;
transition: all 0.3s;
overflow: hidden;
width: 530px;
-webkit-backdrop-filter: saturate(180%) blur(20px);
backdrop-filter: saturate(180%) blur(20px);
background-color: var(--nav-background-color);
box-shadow: 0px 0px 16px rgb(0 0 0 / 10%);
padding-bottom: 20px;
}
.footer .menu.slideup {
bottom: 125px;
height: 500px;
opacity: 1;
box-sizing: border-box;
border: 1px solid rgba(255, 255, 255, 0.08);
}
.footer .menu .menu-header {
height: 30px;
display: flex;
align-items: center;
color: #9e9e9e;
padding: 30px;
user-select: none;
}
.footer .menu .menu-header .menu-title {
flex: 1;
padding: 0 20px;
font-size: 24px;
font-weight: 600;
color: var(--text-default-color);
}
.footer .menu .menu-header .add-all {
border-right: solid 1px #e5e5e5;
flex: 0 0 auto;
display: flex;
align-items: center;
padding-right: 10px;
font-size: 14px;
}
.footer .menu .menu-header .remove-all {
margin-left: 10px;
flex: 0 0 auto;
display: flex;
align-items: center;
font-size: 14px;
}
.footer .menu .menu-header .remove-all:hover .ng-binding,
.footer .menu .menu-header .add-all:hover .ng-binding {
text-decoration: underline;
color: var(--theme-color);
}
.footer .menu .menu-header .remove-all:hover,
.footer .menu .menu-header .add-all:hover {
text-decoration: none;
color: var(--theme-color);
}
.footer .menu .menu-header .close {
margin-left: 15px;
flex: 0 0 25px;
align-items: center;
cursor: pointer;
color: var(--icon-default-color);
}
.footer .menu .menu-header .close:hover {
color: var(--theme-color);
}
.footer .menu .menu-header .add-all span,
.footer .menu .menu-header .remove-all span {
cursor: pointer;
}
.footer .menu .menu-header .add-all .icon,
.footer .menu .menu-header .remove-all .icon {
margin-right: 7px;
width: 18px;
height: 18px;
}
.footer .menu .menu-header .close svg {
margin-right: 3px;
width: 20px;
height: 20px;
display: flex;
justify-content: center;
align-items: center;
}
.footer .menu ul.menu-list {
overflow-y: scroll;
height: 370px;
padding: 0 30px;
font-size: 14px;
}
.footer .menu ul.menu-list li {
border-radius: 10px;
display: flex;
align-items: center;
height: 30px;
position: relative;
margin-bottom: -2px;
padding: 10px 20px 10px 0;
transition: 0.3s;
}
.footer .menu ul.menu-list li:hover {
background: var(--songlist-hover-background-color);
}
.footer .menu ul.menu-list li.playing {
color: var(--important-color);
background: var(--songlist-hover-background-color);
}
.footer .menu ul.menu-list li .song-status-icon {
flex: 0 0 30px;
width: 20px;
height: 30px;
text-align: center;
display: flex;
align-items: center;
}
.footer .menu ul.menu-list li .song-status-icon svg {
width: 10px;
height: 10px;
fill: var(--important-color);
stroke: var(--important-color);
flex: 1;
}
.footer .menu ul.menu-list li .song-title {
flex: 2;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
font-size: 15px;
font-weight: 400;
padding-right: 10px;
}
.footer .menu ul.menu-list li .song-title.disabled {
color: #777777;
}
.footer .menu ul.menu-list li .song-title a {
cursor: pointer;
}
.footer .menu ul.menu-list li .song-singer {
flex: 1;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
cursor: pointer;
padding: 0 10px;
font-weight: 300;
}
.footer .menu ul.menu-list li .tools {
flex: 0 0 42px;
width: 42px;
}
.footer .menu ul.menu-list li .tools .icon {
cursor: pointer;
opacity: 0.5;
}
.footer .menu ul.menu-list li .tools .icon:first-of-type {
margin-right: 5px;
}
.footer .menu ul.menu-list li .tools .icon:hover {
opacity: 1;
}
.footer .menu ul.menu-list li .song-time {
flex: 1;
text-align: right;
}
.footer .right-control {
flex: 0 0 36%;
display: flex;
align-items: center;
justify-content: flex-end;
}
.footer .right-control .playlist-toggle {
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
margin-right: 37px;
padding: 7px;
}
.footer .right-control .ctrl {
display: flex;
justify-content: center;
align-items: center;
}
.footer .right-control .ctrl a {
margin-right: 32px;
padding: 7px;
display: flex;
transition: 0.3s;
border-radius: 10px;
}
.footer .right-control .ctrl a:hover {
text-decoration: none;
background-color: var(--songlist-hover-background-color);
}
.footer .right-control .translate-switch {
border-radius: 10px;
display: flex;
cursor: pointer;
-webkit-app-region: no-drag;
height: 0px;
box-sizing: border-box;
width: 0px;
transition: 0.3s;
overflow: hidden;
margin: 0;
padding: 0;
}
.footer .right-control .translate-switch.slidedown {
padding: 7px;
margin-right: 32px;
height: 35px;
box-sizing: border-box;
width: 32px;
}
.footer .right-control .translate-switch:hover {
background-color: var(--songlist-hover-background-color);
}
.footer .right-control .translate-switch.selected {
color: var(--theme-color);
}
.footer .right-control .mask {
margin-right: 32px;
padding: 7px;
display: flex;
transition: 0.3s;
border-radius: 50%;
}
.footer .right-control .mask.slidedown {
transform: rotate(180deg);
}
.footer .right-control .mask:hover {
background-color: var(--songlist-hover-background-color);
}
.footer .right-control .playlist-toggle .icon {
color: var(--player-right-icon-color);
}
.footer .right-control .playlist-toggle .icon:hover {
color: var(--player-right-icon-hover-color);
}
.footer .right-control .lyric-toggle {
margin-right: 32px;
padding: 7px;
display: flex;
cursor: pointer;
transition: 0.3s;
border-radius: 10px;
}
.footer .right-control .lyric-toggle:hover {
background-color: var(--songlist-hover-background-color);
}
/* footer end */
/* dialog start */
.shadow {
position: fixed;
background: var(--shadow-mask);
_position: absolute;
z-index: 9999;
top: 0;
bottom: 0;
left: 0;
right: 0;
width: 100%;
height: 100%;
background-image: url(data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==);
}
.dialog {
position: absolute;
top: 120px;
width: 400px;
height: 430px;
z-index: 10000;
overflow: hidden;
border-radius: 4px;
background-color: var(--dialog-background-color);
color: var(--dialog-text-color);
box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
}
.dialog-header {
height: 30px;
font-size: 24px;
font-weight: bold;
text-align: center;
padding: 20px;
}
.dialog-header .dialog-close {
float: right;
font-size: 26px;
cursor: pointer;
margin-top: -10px;
}
.dialog-body {
padding: 0 20px;
height: 370px;
overflow-y: auto;
background-color: var(--dialog-background-color);
}
.dialog-body .buttons {
display: flex;
justify-content: center;
margin-top: 20px;
}
.dialog-body .buttons button,
.dialog-body .dialog-footer button {
margin-right: 20px;
font-size: 16px;
font-weight: 500;
transition: 0.2s;
}
.dialog-body .buttons .btn-primary {
background-color: var(--theme-color-hover);
color: var(--theme-color);
}
.dialog-body .buttons button:hover,
.dialog-body .dialog-footer button:hover {
transform: scale(1.2);
}
.dialog .detail-songlist li:hover {
background-color: #e3e3e5;
cursor: pointer;
}
.dialog-body input {
width: calc(100% - 20px);
height: 30px;
border-radius: 10px;
background: #eee;
color: #666;
border: transparent;
padding: 5px 10px;
margin-bottom: 10px;
font-weight: 500;
}
.dialog-body input:focus {
background-color: var(--theme-color-hover);
color: var(--theme-color);
}
.dialog-playlist,
.dialog-backuplist,
.dialog-merge-playlist {
padding-left: 0px;
text-align: left;
}
.dialog-playlist li,
.dialog-backuplist li {
cursor: pointer;
height: 48px;
padding: 6px;
border-radius: 10px;
}
.dialog-merge-playlist li {
cursor: pointer;
height: 48px;
padding: 10px;
border-radius: 10px;
transition: 0.2s;
}
.dialog-backuplist li {
height: 96px;
padding: 6px;
}
.dialog-playlist li:hover,
.dialog-backuplist li:hover,
.dialog-merge-playlist li:hover {
background-color: var(--dialog-highlight-color);
}
.dialog-playlist li img,
.dialog-backuplist li img,
.dialog-merge-playlist li img {
float: left;
height: 48px;
width: 48px;
object-fit: cover;
}
.dialog-playlist li h2,
.dialog-backuplist li h2,
.dialog-merge-playlist li h2 {
margin: 0 0 0 58px;
font-size: 13px;
font-weight: inherit;
}
.dialog-backuplist li h2 {
margin-top: 0;
}
.dialog-newplaylist {
padding: 10px;
}
.dialog-newbackup {
text-align: center;
}
.dialog-editplaylist label,
.dialog-open-url label {
font-size: 18px;
font-weight: 500;
padding: 10px 0;
display: block;
height: 30px;
line-height: 30px;
}
.dialog-editplaylist .dialog-footer {
position: absolute;
bottom: 20px;
}
.dialog-body .field-name {
margin: 10px 0 5px 0;
}
/* dialog end */
/* widget source-list start */
.searchbox {
margin-bottom: 150px;
transition: 0.3s;
}
.searchbox.footerdef {
margin-bottom: 0;
}
.source-list {
margin: 10px 26px 24px 26px;
user-select: none;
display: flex;
align-items: center;
flex-wrap: nowrap;
}
.source-list .source-button {
display: inline-block;
cursor: pointer;
transition: 0.1s;
}
.source-list .source-button:hover,
.source-list .source-button.active {
transition: 0.2s;
padding: 0;
}
.source-list .source-button a:hover {
text-decoration: none;
}
.source-list .source-button.active .buttontext,
.source-list .source-button:hover .buttontext,
.source-list .source-button .buttontext:hover,
.source-list .source-button .buttontext.active {
color: var(--text-default-color);
-webkit-app-region: no-drag;
font-size: 24px;
font-weight: 700;
text-decoration: none;
border-radius: 10px;
padding: 6px 10px;
transition: all 0.2s, background 0.3s;
-webkit-user-drag: none;
margin: 0px 12px;
white-space: nowrap;
}
.source-list .source-button.active .buttontext,
.source-list .source-button .buttontext.active {
border-bottom: solid 2px var(--text-default-color);
}
.source-list .source-button:hover .buttontext,
.source-list .source-button .buttontext:hover {
background-color: var(--button-background-color);
}
.source-list .source-button .buttontext {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
font-size: 14px;
margin: 4px 10px;
color: var(--text-subtitle-color);
transition: 0.1s;
}
.source-list .splitter {
display: inline-block;
background: #a9a9a9;
margin-top: 1px;
height: 12px;
width: 1px;
}
.source-list .search-type {
float: right;
flex: 1;
display: flex;
align-items: center;
flex-wrap: nowrap;
justify-content: flex-end;
}
/* widget source-list end */
/* widget playlist-filter start */
.playlist-filter {
display: flex;
flex-wrap: wrap;
line-height: 38px;
margin: 0 26px 0px 26px;
}
.playlist-filter .filter-item {
display: flex;
justify-content: center;
align-items: center;
line-height: 20px;
padding: 8px 16px;
margin: 10px 16px 6px 0;
color: var(--black--white);
font-weight: 600;
font-size: 16px;
border-radius: 10px;
transition: all 0.2s;
}
.playlist-filter .filter-item.active,
.playlist-filter .filter-item:hover {
background: var(--theme-color-hover);
color: var(--theme-color);
transition: all 0.2s;
}
/* widget playlist-filter end */
/* widget all-playlist-filter start */
.all-playlist-filter {
margin: 10px 26px 0px 26px;
border-radius: 10px;
padding: 8px;
background-color: var(--button-background-color);
}
.all-playlist-filter .category {
margin-bottom: 32px;
display: flex;
}
.all-playlist-filter .category .category-title {
font-size: 24px;
font-weight: 700;
opacity: 0.68;
margin-left: 24px;
min-width: 54px;
height: 26px;
margin-top: 8px;
/* color: var(--icon-default-color); */
}
.all-playlist-filter .category .category-filters {
margin-left: 24px;
display: flex;
flex-wrap: wrap;
/* color: var(--icon-default-color); */
}
.all-playlist-filter .category .category-filters .filter-item {
min-width: 98px;
margin-top: 4px;
display: flex;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
align-items: center;
font-weight: 500;
font-size: 16px;
transition: 0.2s;
}
.all-playlist-filter .category .category-filters .filter-item span {
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
padding: 6px 10px;
height: 26px;
border-radius: 12px;
opacity: 0.88;
transition: 0.2s;
}
.all-playlist-filter .category .category-filters .filter-item span:hover {
opacity: 1;
background-color: var(--theme-color-hover);
border-radius: var(--default-border-radius);
transition: 0.2s;
color: var(--theme-color);
}
.all-playlist-filter .category .category-filters .filter-item span.active {
color: var(--theme-color);
}
/* widget all-playlist-filter end */
================================================
FILE: css/cover.css
================================================
/*
* Globals
*/
/* Links */
a,
a:focus,
a:hover {
color: #fff;
}
/* Custom default button */
.btn-default,
.btn-default:hover,
.btn-default:focus {
color: #333;
text-shadow: none; /* Prevent inheritence from `body` */
background-color: #fff;
border: 1px solid #fff;
}
/*
* Base structure
*/
html,
body {
height: 100%;
background-color: #333;
}
body {
color: #fff;
overflow: hidden !important;
/* text-align: center;*/
/*text-shadow: 0 1px 3px rgba(0,0,0,.5);*/
}
/* Extra markup and styles for table-esque vertical and horizontal centering */
.site-wrapper {
display: table;
width: 100%;
height: 100%; /* For at least Firefox */
min-height: 100%;
/* -webkit-box-shadow: inset 0 0 100px rgba(0,0,0,.5);
box-shadow: inset 0 0 100px rgba(0,0,0,.5);*/
}
.site-wrapper-inner {
display: table-cell;
vertical-align: top;
}
.cover-container {
margin-right: auto;
margin-left: auto;
}
/* Padding for spacing */
.inner {
padding: 30px;
}
/*
* Header
*/
.masthead-brand {
margin-top: 10px;
margin-bottom: 10px;
}
.masthead-nav > li {
display: inline-block;
}
.masthead-nav > li + li {
margin-left: 20px;
}
.masthead-nav > li > a {
padding-right: 0;
padding-left: 0;
font-size: 16px;
font-weight: bold;
color: #fff; /* IE8 proofing */
color: rgba(255, 255, 255, 0.75);
border-bottom: 2px solid transparent;
}
.masthead-nav > li > a:hover,
.masthead-nav > li > a:focus {
background-color: transparent;
border-bottom-color: #a9a9a9;
border-bottom-color: rgba(255, 255, 255, 0.25);
}
.masthead-nav > .active > a,
.masthead-nav > .active > a:hover,
.masthead-nav > .active > a:focus {
color: #fff;
border-bottom-color: #fff;
}
@media (min-width: 768px) {
.masthead-brand {
float: left;
}
.masthead-nav {
float: right;
}
}
/*
* Cover
*/
.cover {
padding: 0 20px;
}
.cover .btn-lg {
padding: 10px 20px;
font-weight: bold;
}
/*
* Footer
*/
.mastfoot {
color: #999; /* IE8 proofing */
color: rgba(255, 255, 255, 0.5);
}
/*
* Affix and center
*/
@media (min-width: 768px) {
/* Pull out the header and footer */
.masthead {
position: fixed;
top: 0;
}
.mastfoot {
position: fixed;
bottom: 0;
}
/* Start the vertical centering */
.site-wrapper-inner {
vertical-align: middle;
}
/* Handle the widths */
.masthead,
.mastfoot,
.cover-container {
width: 100%; /* Must be percentage or pixels for horizontal alignment */
}
}
@media (min-width: 992px) {
.masthead,
.mastfoot,
.cover-container {
width: 880px;
}
}
/*
* Scroll bar
*
*/
:root {
--scrollWidth: 10px;
}
::-webkit-scrollbar {
width: var(--scrollWidth);
height: var(--scrollWidth);
}
::-webkit-scrollbar-button {
width: 0;
height: 0;
}
::-webkit-scrollbar-button:start:increment,
::-webkit-scrollbar-button:end:decrement {
display: none;
}
::-webkit-scrollbar-corner {
display: block;
}
::-webkit-scrollbar-track,
::-webkit-scrollbar-thumb {
border-radius: 8px;
border-right: 1px solid transparent;
border-left: 1px solid transparent;
}
::-webkit-scrollbar-thumb {
background-color: rgba(255, 255, 255, 0.2);
}
::-webkit-scrollbar-thumb:hover {
background-color: rgba(255, 255, 255, 0.3);
}
::-webkit-scrollbar-track:hover {
background-color: rgba(255, 255, 255, 0.08);
}
================================================
FILE: css/hotkeys.css
================================================
/*!
* angular-hotkeys v1.7.0
* https://chieffancypants.github.io/angular-hotkeys
* Copyright (c) 2016 Wes Cruver
* License: MIT
*/
.cfp-hotkeys-container {
display: table !important;
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
color: #333;
font-size: 1em;
background-color: rgba(255, 255, 255, 0.9);
}
.cfp-hotkeys-container.fade {
z-index: -1024;
visibility: hidden;
opacity: 0;
-webkit-transition: opacity 0.15s linear;
-moz-transition: opacity 0.15s linear;
-o-transition: opacity 0.15s linear;
transition: opacity 0.15s linear;
}
.cfp-hotkeys-container.fade.in {
z-index: 10002;
visibility: visible;
opacity: 1;
}
.cfp-hotkeys-title {
font-weight: bold;
text-align: center;
font-size: 1.2em;
}
.cfp-hotkeys {
width: 100%;
height: 100%;
display: table-cell;
vertical-align: middle;
}
.cfp-hotkeys table {
margin: auto;
color: #333;
}
.cfp-content {
display: table-cell;
vertical-align: middle;
}
.cfp-hotkeys-keys {
padding: 5px;
text-align: right;
}
.cfp-hotkeys-key {
display: inline-block;
color: #fff;
background-color: #333;
border: 1px solid #333;
border-radius: 5px;
text-align: center;
margin-right: 5px;
box-shadow: inset 0 1px 0 #666, 0 1px 0 #bbb;
padding: 5px 9px;
font-size: 1em;
}
.cfp-hotkeys-text {
padding-left: 10px;
font-size: 1em;
}
.cfp-hotkeys-close {
position: fixed;
top: 20px;
right: 20px;
font-size: 2em;
font-weight: bold;
padding: 5px 10px;
border: 1px solid #ddd;
border-radius: 5px;
min-height: 45px;
min-width: 45px;
text-align: center;
}
.cfp-hotkeys-close:hover {
background-color: #fff;
cursor: pointer;
}
@media all and (max-width: 500px) {
.cfp-hotkeys {
font-size: 0.8em;
}
}
@media all and (min-width: 750px) {
.cfp-hotkeys {
font-size: 1.2em;
}
}
================================================
FILE: css/icon.css
================================================
@font-face {
font-family: 'listen1-icon';
src: url('../fonts/listen1-icon.eot?4ftssm');
src: url('../fonts/listen1-icon.eot?4ftssm#iefix') format('embedded-opentype'),
url('../fonts/listen1-icon.ttf?4ftssm') format('truetype'),
url('../fonts/listen1-icon.woff?4ftssm') format('woff'),
url('../fonts/listen1-icon.svg?4ftssm#listen1-icon') format('svg');
font-weight: normal;
font-style: normal;
}
[class^='li-'],
[class*=' li-'] {
/* use !important to prevent issues with browser extensions that change fonts */
font-family: 'listen1-icon' !important;
speak: none;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
/* Better Font Rendering =========== */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.li-play:before {
content: '\e900';
}
.li-previous:before {
content: '\e901';
}
.li-next:before {
content: '\e902';
}
.li-pause:before {
content: '\e903';
}
.li-random-loop:before {
content: '\e904';
}
.li-single-cycle:before {
content: '\e905';
}
.li-mute:before {
content: '\e906';
}
.li-volume:before {
content: '\e907';
}
.li-list:before {
content: '\e908';
}
.li-loop:before {
content: '\e909';
}
.li-del:before {
content: '\e90a';
}
.li-close:before {
content: '\e90b';
}
.li-back:before {
content: '\e90c';
}
.li-play-s:before {
content: '\e90d';
}
.li-collapse:before {
content: '\e90e';
}
.li-add:before {
content: '\e90f';
}
.li-advance:before {
content: '\e910';
}
.li-link:before {
content: '\e911';
}
.li-setting:before {
content: '\e912';
}
.li-songlist:before {
content: '\e913';
}
.li-featured-list:before {
content: '\e914';
}
================================================
FILE: css/iparanoid.css
================================================
/* global settings (theme related) */
:root {
--icon-default-color: #666666;
--icon-highlight-color: #111111;
--text-default-color: #111111;
--text-subtitle-color: #666666;
--text-disable-color: #999999;
--lyric-default-color: #666666;
--lyric-on-cover-color: #333333;
--lyric-important-color: #ff4444;
--lyric-important-on-cover-color: #ffffff;
--link-default-color: #999999;
--link-highlight-color: #111111;
--link-active-color: #323232;
--link-inactive-color: #a9a9a9;
--line-default-color: #e5e5e5;
--sidebar-background-color: rgba(245, 245, 245, 0.7);
--sidebar-highlight-background-color: #4d4d4d;
--sidebar-highlight-text-color: #ffffff;
--sidebar-hover-background-color: #5f5f5f;
--sidebar-hover-text-color: #ffffff;
--content-background-color: #ffffff;
--foot-background-color: #ffffff;
--foot-border-color: #e5e5e5;
--footer-main-background-color: #f2f2f2;
--footer-player-bar-background-color: #e0e0e0;
--footer-player-bar-cur-background-color: #666666;
--footer-header-background-color: #e7e7e7;
--footer-menu-even-background-color: #f7f7f7;
--footer-menu-hover-background-color: #e5e5e5;
--search-input-background-color: #f2f2f2;
--footer-player-bar-cur-button-color: #111111;
--window-control-border-color: #dddddd;
--important-color: #ff4444;
--button-background-color: #eeeeee;
--button-border-color: #bebebe;
--button-hover-background-color: #dddddd;
--now-playing-page-background-color: #ffffff;
--now-playing-close-icon-color: #666666;
--disable-song-title-color: #b7b7b7;
--windows-border-color: #dddddd;
--default-border-radius: 2px;
--text-default-size: 13px;
--h2-title-font-size: 24px;
--badge-font-size: 12px;
--badge-font-color: #c75449;
--badge-border-color: #d98e87;
--songlist-odd-background-color: #f5f5f5;
--songlist-border-color: #f4f4f4;
--songlist-hover-background-color: #eeeeee;
--player-left-icon-color: #b1b1b1;
--player-icon-color: #666666;
--player-icon-hover-color: #666666;
--player-right-icon-color: #333333;
--player-right-icon-hover-color: #000000;
--dialog-highlight-color: #e3e3e5;
--dialog-background-color: #fafafa;
--dialog-text-color: #565656;
--volume-icon-color: #333333;
--volume-bar-background-color: #e0e0e0;
--volume-bar-current-background-color: #333333;
--scroll-color: #c2c2c2;
--lyric-icon-background-color: #ffffff;
--lyric-font-size: 15px;
--lyric-line-margin: 20px;
}
================================================
FILE: css/iparanoid2.css
================================================
/* global settings (theme related) */
:root {
--icon-default-color: #000;
--text-default-color: #000;
--text-subtitle-color: #7a7a7b;
/* --text-disable-color: #999999; */
--lyric-default-color: #666666;
--lyric-on-cover-color: #333333;
--lyric-important-on-cover-color: #ffffff;
--link-default-color: #999999;
--link-active-color: #323232;
--line-default-color: #e5e5e5;
--sidebar-highlight-background-color: #f2f2f3;
--sidebar-hover-background-color: #f2f2f3;
--sidebar-hover-text-color: #262626;
--content-background-color: #ffffff;
--footer-player-bar-cur-background-color: #666666;
--search-input-background-color: #f2f2f3;
--footer-player-bar-cur-button-color: #111111;
--footer-player-bar-background-color: #e0e0e0;
--window-control-border-color: #dddddd;
--important-color: #017afe;
--button-background-color: #f5f5f7;
--button-border-color: #bebebe;
--button-hover-background-color: #dddddd;
--now-playing-close-icon-color: #666666;
--disable-song-title-color: #b7b7b7;
--windows-border-color: #dddddd;
--default-border-radius: 10px;
--text-default-size: 13px;
--h2-title-font-size: 24px;
--badge-font-size: 12px;
--songlist-odd-background-color: #f5f5f5;
--songlist-hover-background-color: #f2f2f7;
--player-icon-color: #666666;
--player-icon-hover-color: #666666;
--player-right-icon-color: #333333;
--player-right-icon-hover-color: #000000;
--dialog-highlight-color: #e3e3e5;
--dialog-background-color: #fafafa;
--dialog-text-color: #565656;
--volume-icon-color: #333333;
--scroll-color: #c2c2c2;
--lyric-icon-background-color: #ffffff;
--footer-background-color: hsla(0, 0%, 100%, 0.86);
--nav-background-color: hsla(0, 0%, 100%, 0.86);
--color-body-bg: #fff;
--white--black: #fff;
--black--white: #222;
--white--black-background: #222;
--theme-color: #017afe;
--theme-color-ope: rgba(1, 122, 254, 0.4);
--theme-color-hover: #f0f7ff;
--sidebar-background: #f2f2f7;
--sidebar-button-background: #fff;
--sidebar-splitter: #1d1d1f;
--shadow-mask: rgba(30, 30, 30, 0.5);
}
================================================
FILE: css/notyf_custom.css
================================================
.notyf__toast {
border-radius: 10px;
}
.notyf__dismiss-btn {
outline: 0;
}
================================================
FILE: css/origin.css
================================================
/* global settings (theme related) */
:root {
--icon-default-color: #666666;
--icon-highlight-color: #111111;
--text-default-color: #ffffff;
--text-subtitle-color: #666666;
--text-disable-color: #999999;
--lyric-default-color: #666666;
--lyric-on-cover-color: #bbbbbb;
--lyric-important-color: #ffffff;
--lyric-important-on-cover-color: #ffffff;
--link-default-color: #999999;
--link-highlight-color: #ffffff;
--link-active-color: #ffffff;
--link-inactive-color: rgba(255, 255, 255, 0.75);
--line-default-color: #333333;
--sidebar-background-color: #2e2e2e;
--sidebar-highlight-background-color: #4d4d4d;
--sidebar-highlight-text-color: #ffffff;
--sidebar-hover-background-color: #3c3c3c;
--sidebar-hover-text-color: #ffffff;
--content-background-color: #333333;
--foot-background-color: #222222;
--foot-border-color: #222222;
--footer-main-background-color: #222222;
--footer-player-bar-background-color: #666666;
--footer-player-bar-cur-background-color: #e0e0e0;
--footer-header-background-color: #333333;
--footer-menu-even-background-color: #2d2d2d;
--footer-menu-hover-background-color: #333333;
--search-input-background-color: #222222;
--footer-player-bar-cur-button-color: #e0e0e0;
--window-control-border-color: #dddddd;
--important-color: #fff;
--button-background-color: #222222;
--button-border-color: #222222;
--button-hover-background-color: #444444;
--now-playing-page-background-color: #333333;
--now-playing-close-icon-color: #b3b3b3;
--disable-song-title-color: #b7b7b7;
--windows-border-color: #333333;
--default-border-radius: 2px;
--text-default-size: 13px;
--h2-title-font-size: 24px;
--badge-font-size: 12px;
--badge-font-color: #c3473a;
--badge-border-color: #843932;
--songlist-odd-background-color: #2d2d2d;
--songlist-border-color: transparent;
--songlist-hover-background-color: #3e3e3e;
--player-left-icon-color: #b3b3b3;
--player-icon-color: #b3b3b3;
--player-icon-hover-color: #eeeeee;
--player-right-icon-color: #b3b3b3;
--player-right-icon-hover-color: #eeeeee;
--player-icon-hightlight-color: #eeeeee;
--dialog-highlight-color: #444444;
--dialog-background-color: #333;
--dialog-text-color: #ffffff;
--volume-icon-color: #b3b3b3;
--volume-bar-background-color: #333333;
--volume-bar-current-background-color: #e0e0e0;
--scroll-color: #444444;
--lyric-icon-background-color: #222222;
--lyric-font-size: 15px;
--lyric-line-margin: 20px;
}
================================================
FILE: css/origin2.css
================================================
/* global settings (theme related) */
:root {
--icon-default-color: #666666;
--text-default-color: #ffffff;
--text-subtitle-color: #7a7a7b;
--lyric-default-color: #666666;
--lyric-on-cover-color: #bbbbbb;
--lyric-important-on-cover-color: #ffffff;
--link-default-color: #999999;
--link-active-color: #ffffff;
--line-default-color: rgba(255, 255, 255, 0.08);
--sidebar-highlight-background-color: #4d4d4d;
--sidebar-hover-background-color: #3c3c3c;
--sidebar-hover-text-color: #ffffff;
--content-background-color: #222;
--footer-player-bar-background-color: #666666;
--footer-player-bar-cur-background-color: #e0e0e0;
--search-input-background-color: #323232;
--footer-player-bar-cur-button-color: #e0e0e0;
--window-control-border-color: #dddddd;
--important-color: #017afe;
--button-background-color: #323232;
--button-border-color: #323232;
--button-hover-background-color: #444444;
--now-playing-close-icon-color: #b3b3b3;
--disable-song-title-color: #b7b7b7;
--windows-border-color: #222;
--default-border-radius: 10px;
--text-default-size: 13px;
--h2-title-font-size: 24px;
--badge-font-size: 12px;
--songlist-odd-background-color: #2d2d2d;
--songlist-hover-background-color: #3e3e3e;
--player-icon-color: #b3b3b3;
--player-icon-hover-color: #eeeeee;
--player-right-icon-color: #b3b3b3;
--player-right-icon-hover-color: #eeeeee;
--dialog-highlight-color: #444444;
--dialog-background-color: #222;
--dialog-text-color: #ffffff;
--volume-icon-color: #b3b3b3;
--scroll-color: #444444;
--lyric-icon-background-color: #323232;
--nav-background-color: rgba(34, 34, 34, 0.86);
--color-body-bg: #222;
--white--black: #222;
--black--white: #fff;
--white--black-background: #fff;
--theme-color: #017afe;
--theme-color-ope: rgba(1, 122, 254, 0.4);
--theme-color-hover: #bbcdff;
--sidebar-background: #1D1D1F;
--sidebar-button-background: #323232;
--sidebar-splitter: #ebebec;
--shadow-mask: rgba(0, 0, 0, 0.5);
}
================================================
FILE: css/player.css
================================================
a {
cursor: pointer;
}
.shadow {
position: fixed;
background: rgba(30, 30, 30, 0.5);
_position: absolute;
z-index: 9999;
top: 0;
bottom: 0;
left: 0;
right: 0;
width: 100%;
height: 100%;
background-image: url(data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==);
}
.dialog {
position: absolute;
top: 120px;
width: 480px;
height: 420px;
z-index: 10000;
overflow: hidden;
border-radius: 4px 4px 4px 4px;
padding: 20px;
background-color: #333;
}
.dialog-header {
width: 100%;
height: 30px;
font-family: Arial, Helvetica, sans-serif;
font-size: 15px;
font-weight: bold;
text-align: left;
border-bottom: 1px solid;
margin-bottom: 20px;
}
.dialog-header .dialog-close {
float: right;
font-size: 33px;
cursor: pointer;
margin-top: -15px;
}
.dialog-body {
width: 100%;
height: 320px;
overflow-y: auto;
background-color: #333;
}
/*.masthead {
z-index: 999;
}*/
.masthead,
.mastfoot {
margin: 0 auto;
left: 0;
right: 0;
z-index: 999;
background-color: #222222;
}
.masthead {
background-color: #333;
height: 90px;
}
.masthead .logo {
float: left;
height: 50px;
width: 50px;
margin-right: 20px;
cursor: pointer;
}
.masthead .masthead-brand {
color: rgba(255, 255, 255, 1);
cursor: pointer;
}
.cover-container {
position: relative;
}
.container-placeholder {
margin-top: 90px;
}
.site-wrapper {
width: 100%;
overflow: hidden;
position: absolute;
padding-left: 17px;
}
.site-wrapper-innerd {
overflow-y: scroll;
margin-top: 90px;
/* uncomment the line below will hide the scroll bar */
/*padding-right: 17px;*/
box-sizing: content-box;
width: 100%;
background-color: #333;
}
.searchbox {
/* margin-top: 100px;*/
}
.searchbox .nav {
margin-top: 12px;
}
.searchbox .nav .searchspinner {
margin-top: 8px;
height: 25px;
}
.searchitem {
height: 92px;
}
.searchitem img {
float: left;
height: 90px;
width: 90px;
}
.searchitem div {
float: left;
margin-left: 48px;
margin-top: 38px;
width: 400px;
}
.playlist-covers {
margin-bottom: 0px;
}
.playlist-covers li {
float: left;
display: inline-block;
width: 140px;
height: 188px;
margin-right: 22px;
}
.playlist-covers .desc {
text-align: left;
}
.playlist-covers .u-cover {
position: relative;
display: block;
width: 140px;
height: 140px;
}
.playlist-covers .u-cover .bottom {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 27px;
color: #ccc;
}
.playlist-covers .loading_bottom {
clear: both;
text-align: center;
}
.playlist-covers .loading_bottom img {
height: 35px;
}
.u-cover .mask {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.u-cover img {
display: block;
width: 100%;
height: 100%;
}
.u-cover .icon-play {
position: absolute;
right: 10px;
bottom: 5px;
width: 16px;
height: 17px;
background: url(../images/player_directplay.png);
}
.playlist-covers .u-cover .bottom .nb {
float: left;
margin: 7px 0 0 0;
}
.m-playbar {
position: absolute;
zoom: 1;
top: -90px;
left: 0;
width: 100%;
height: 90px;
margin: 0 auto;
background-color: #222222;
}
.m-playbar .btns {
width: 157px;
padding: 27px 0 0 19px;
}
.m-playbar .btns,
.m-playbar .head,
.m-playbar .play,
.m-playbar .volum,
.m-playbar .oper {
float: left;
}
.m-pbar .btn i {
visibility: hidden;
position: absolute;
left: 5px;
top: 5px;
width: 12px;
height: 12px;
background: url(../images/loading.gif);
}
.m-pbar .barbg,
.m-pbar .cur,
.m-pbar .left {
background: url(../images/statbar.png) no-repeat 0 9999px;
_background-image: url(../images/statbar.png);
}
.m-playbar .btns a {
background: url(../images/player_large.png) no-repeat 0 9999px;
_background-image: url(../images/player_large.png);
cursor: pointer;
}
.m-playbar .btns a {
display: block;
float: left;
width: 36px;
height: 36px;
margin-right: 8px;
margin-top: 0px;
text-indent: -9999px;
}
.m-playbar .btns .previous {
background-position: -72px 0px;
}
.m-playbar .btns .previous:hover {
background-position: -72px -36px;
}
.m-playbar .btns .play {
width: 36px;
height: 36px;
margin-top: 0;
background-position: 0px 0px;
}
.m-playbar .btns .play:hover {
background-position: 0px -36px;
}
.m-playbar .btns .pas {
background-position: -108px 0px;
}
.m-playbar .btns .pas:hover {
background-position: -108px -36px;
}
.m-playbar .btns .next {
/* pause icon distance adjust from 36 to 38 */
background-position: -38px 0px;
}
.m-playbar .btns .next:hover {
background-position: -38px -36px;
}
.m-playbar .head {
position: relative;
margin: 10px 15px 0 0;
}
.m-playbar .head,
.m-playbar .head img {
width: 70px;
height: 70px;
}
.m-playbar .head .mask {
position: absolute;
top: 0px;
left: 0px;
display: block;
width: 70px;
height: 70px;
}
.m-playbar .maininfo {
float: none;
margin-left: 245px;
margin-right: 120px;
}
.m-playbar .words .notextdeco {
text-decoration: none;
}
.m-playbar .words {
margin-top: 14px;
height: 28px;
overflow: hidden;
color: #e8e8e8;
text-shadow: 0 1px 0 #171717;
line-height: 28px;
}
.m-playbar .words .name {
max-width: 300px;
}
.m-playbar .words .by {
max-width: 220px;
margin-left: 15px;
color: #9b9b9b;
}
.m-playbar .words .by a {
color: #9b9b9b;
}
.m-playbar .words .src {
cursor: pointer;
float: left;
width: 25px;
height: 25px;
margin: 2px 0 0 13px;
background: url(../images/player_small.png) no-repeat 0 9999px;
background-position: -100px 0px;
}
.m-playbar .words .src:hover {
background-position: -100px -25px;
}
.m-playbar .words .fc1 {
color: #e8e8e8;
margin-left: 3px;
}
.overflowhide {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.floatleft {
float: left;
}
.m-pbar {
position: relative;
}
.m-pbar.play {
width: 80%;
margin-top: 14px;
}
.m-pbar.volume {
position: absolute;
right: 13px;
bottom: 11px;
float: right;
width: 56%;
margin-top: 0px;
}
.m-pbar .barbg,
.m-pbar .cur,
.m-pbar .rdy {
height: 7px;
}
.m-pbar .barbg {
background-position: right 0;
}
.m-pbar .cur {
position: absolute;
top: 0;
left: 0;
width: 1%;
background-position: left -9px;
}
.m-pbar .btn {
position: absolute;
top: -8px;
right: -13px;
width: 22px;
height: 24px;
margin-left: -11px;
background: url(../images/progress_indicator.png) no-repeat;
}
.m-playbar .time {
position: absolute;
right: -122px;
top: -6px;
}
.m-playbar .time {
float: right;
margin-right: 20px;
color: #797979;
text-shadow: 0 1px 0 #121212;
}
.m-playbar .time em {
color: #a1a1a1;
}
em,
i {
font-style: normal;
text-align: left;
font-size: inherit;
}
.m-playbar a {
background: url(../images/player_small.png) no-repeat 0 9999px;
}
.m-playbar .ctrl {
position: absolute;
right: 0px;
bottom: 48px;
z-index: 10;
width: 103px;
padding-left: 13px;
float: none;
}
.m-playbar .icn-add {
background-position: -25px 0px;
}
.m-playbar .icn-add:hover {
background-position: -25px -25px;
}
.m-playbar .icn-list {
background-position: -125px 0px;
}
.m-playbar .icn-vol {
background-position: -175px 0px;
}
.m-playbar .icn-vol-mute {
background-position: -200px 0px;
}
.m-playbar .icn-list:hover {
background-position: -125px -25px;
}
.m-playbar .icn-loop {
background-position: -50px 0px;
}
.m-playbar .icn-loop:hover {
background-position: -50px -25px;
}
.m-playbar .icn-vol:hover {
background-position: -175px -25px;
}
.m-playbar .icn-vol-mute:hover {
background-position: -200px -25px;
}
.m-playbar .icn-shuffle {
background-position: -150px 0px;
}
.m-playbar .icn-shuffle:hover {
background-position: -150px -25px;
}
.m-playbar .icn-repeatone {
background-position: -225px 0px;
}
.m-playbar .icn-repeatone:hover {
background-position: -225px -25px;
}
.m-playbar .icn {
float: left;
width: 25px;
height: 25px;
margin: 11px 2px 0 0;
text-indent: -9999px;
}
.m-playbar .icn-add {
margin-right: 5px;
}
.m-playbar .menu {
position: absolute;
bottom: 90px;
_bottom: 90px;
right: 0px;
_right: 0px;
height: 349px;
width: 60%;
background-color: #121212;
}
.m-playbar .menu ul {
display: inline-block;
padding-left: 0px;
height: 308px;
overflow-y: scroll;
margin-bottom: 0px;
}
.m-playbar .menu li {
float: left;
width: 100%;
display: block;
}
.m-playbar .menu .lyric {
text-align: center;
width: 39%;
display: inline-block;
height: 308px;
overflow-y: scroll;
position: relative;
}
.m-playbar .menu .lyric p {
min-height: 20px;
}
.m-playbar .menu .lyric .placeholder {
height: 50px;
}
.m-playbar .menu .lyric .highlight {
font-size: 15px;
color: #ffffff;
}
.m-playbar .menu .playing {
background-color: #555555;
}
.m-playbar .menu li:hover,
.m-playbar .menu li:focus {
background-color: #999999;
}
.m-playbar .menu .icn-remove {
height: 20px;
width: 20px;
background-position: -75px -25px;
display: inline-block;
}
.m-playbar .menu .icn-remove:hover {
background-position: -75px -25px;
}
.volume-ctrl {
position: absolute;
right: 0px;
bottom: 16px;
width: 110px;
}
li {
list-style: none;
}
.menu-header {
height: 40px;
background-color: #222222;
padding-top: 4px;
text-align: center;
}
.menu-header span {
position: absolute;
left: 19px;
top: 7px;
font-size: 18px;
color: #ffffff;
}
.menu-header small {
background-color: #333333;
color: #ffffff;
cursor: pointer;
vertical-align: middle;
display: inline-block;
width: 60px;
line-height: 20px;
}
.menu-header a:hover small {
background-color: #ffffff;
color: #333333;
}
.menu .add-all {
display: inline-block;
position: absolute;
left: 335px;
top: 9px;
}
.menu .remove-all {
display: inline-block;
position: absolute;
left: 410px;
top: 9px;
}
.menu .close-popup {
float: right;
margin-right: 14px;
font-size: 20px;
text-decoration: none;
color: #aaaaaa;
}
.menu .close-popup:hover {
color: #ffffff;
}
.menu .title {
width: 300px;
float: left;
height: 28px;
padding-top: 3px;
text-align: left;
padding-left: 20px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
cursor: pointer;
}
.menu .singer {
width: 180px;
float: right;
height: 28px;
padding-top: 3px;
text-align: left;
padding-left: 20px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
cursor: pointer;
}
.dbimport {
/*margin-top: 100px;*/
}
.form-signin {
width: 300px;
margin-left: auto;
margin-right: auto;
text-align: center;
}
.form-signin .form-control,
.form-signin .valid-img,
.form-signin .btn {
margin-top: 10px;
}
.form-signin .valid-img {
height: 40px;
width: 220px;
}
.form-signin .security-notice {
margin-top: 10px;
}
.playlist-detail {
position: absolute;
text-align: left;
background-color: #333;
width: 100%;
}
.playlist-detail .detail-head {
width: 200px;
position: fixed;
margin-bottom: 20px;
}
.playlist-detail .detail-head-cover {
height: 180px;
/* width: 225px;*/
float: left;
margin: 10px;
}
.playlist-detail .detail-head-cover img {
max-width: 100%;
max-height: 100%;
}
.detail-head-title {
float: left;
width: 100%;
text-align: center;
}
.detail-head-title a {
display: inline-block;
text-indent: -9999px;
width: 36px;
height: 36px;
margin-top: 0;
background: url(../images/player_large.png) no-repeat 0 9999px;
}
.detail-head-title .play {
background-position: 0px 0px;
}
.detail-head-title .play:hover {
background-position: 0px -36px;
}
.detail-head-title .add {
background-position: -216px 0px;
}
.detail-head-title .add:hover {
background-position: -216px -36px;
}
.detail-head-title .link {
background-position: -250px 0px;
}
.detail-head-title .link:hover {
background-position: -250px -36px;
}
.detail-head-title .edit {
background-position: -288px 0px;
}
.detail-head-title .edit:hover {
background-position: -288px -36px;
}
.detail-head-title .clone {
background-position: -144px 0px;
}
.detail-head-title .clone:hover {
background-position: -144px -36px;
}
.detail-head-title .merge {
background-position: -324px 0px;
}
.detail-head-title .merge:hover {
background-position: -324px -36px;
}
.detail-head-title .ply:hover {
background-position: -40px -204px;
}
.playlist-detail .detail-head-title h2 {
font-size: 17px;
margin-bottom: 35px;
}
.playlist-detail .detail-songlist {
margin-left: 220px;
margin-top: 6px;
margin-right: 14px;
}
.playsong-detail .detail-head {
width: 390px;
position: fixed;
margin-bottom: 20px;
}
.playsong-detail .detail-songinfo {
padding-left: 440px;
padding-right: 55px;
}
.playsong-detail .detail-head .detail-head-cover {
margin: 0 auto;
width: 200px;
}
.playsong-detail .detail-head .detail-head-cover img {
width: 240px;
height: 240px;
}
.playsong-detail .detail-songinfo h2 {
font-size: 22px;
}
.playsong-detail .detail-songinfo .info {
border-bottom: solid #444 1px;
margin-bottom: 5px;
padding-bottom: 10px;
}
.playsong-detail .detail-songinfo .info span {
color: #9b9b9b;
margin-right: 10px;
}
.playsong-detail .detail-songinfo .info span.album {
margin-left: 30px;
}
.playsong-detail .lyric {
color: #999; /* IE8 proofing */
color: rgba(255, 255, 255, 0.5);
text-align: left;
width: 100%;
display: inline-block;
height: 410px;
overflow-y: scroll;
position: relative;
font-size: 15px;
}
.playsong-detail .lyric p {
min-height: 20px;
}
.playsong-detail .lyric .placeholder {
height: 50px;
}
.playsong-detail .lyric .highlight {
color: #ffffff;
}
.detail-songlist {
padding-left: 0px;
text-align: left;
}
.detail-songlist li {
float: left;
width: 100%;
display: block;
padding: 10px;
}
.detail-songlist .col2 {
float: left;
width: 28%;
margin-left: 2%;
font-size: 15px;
}
.detail-songlist .col1 {
float: left;
width: 19%;
margin-left: 2%;
}
.detail-songlist .disabled {
color: #777777;
}
.detail-songlist .col-add {
float: left;
width: 75px;
margin-left: 2%;
}
.detail-songlist .detail-tools {
float: right;
height: 21px;
position: relative;
width: 118px;
}
.detail-songlist .detail-tools a {
background: url(../images/player_small.png) no-repeat 0 9999px;
height: 25px;
width: 25px;
cursor: pointer;
}
.detail-songlist .detail-tools .detail-add-button {
background-position: 0px 0px;
}
.detail-songlist .detail-tools .detail-fav-button {
background-position: -25px 0px;
}
.detail-songlist .detail-tools .detail-delete-button {
background-position: -75px 0px;
}
.detail-songlist .detail-tools .source-button {
background-position: -100px 0px;
}
.detail-songlist .detail-tools .detail-add-button:hover {
background-position: 0px -25px;
}
.detail-songlist .detail-tools .detail-fav-button:hover {
background-position: -25px -25px;
}
.detail-songlist .detail-tools .detail-delete-button:hover {
background-position: -75px -25px;
}
.detail-songlist .detail-tools .source-button:hover {
background-position: -100px -25px;
}
.detail-songlist .detail-tools a {
text-decoration: none;
display: inline-block;
}
.detail-songlist .detail-artist a {
color: #777777;
}
.detail-songlist .odd {
background-color: #333;
}
.detail-songlist .even,
.detail-songlist .detail-add {
background-color: #2d2d2d;
}
.dialog .detail-songlist li:hover {
background-color: #999999;
cursor: pointer;
}
/*.playlist-detail .detail-songlist li:hover {
background-color: #999999;
}*/
.playlist-detail .btn {
width: 88px;
margin-top: 0;
float: left;
}
.cover-container .detail-close {
position: absolute;
right: -32px;
top: 0px;
}
.cover-container .detail-close span {
font-size: 34px;
cursor: pointer;
color: #aaaaaa;
}
.cover-container .detail-close span:hover {
color: #ffffff;
}
.dialog-playlist {
padding-left: 0px;
text-align: left;
}
.dialog-playlist li {
cursor: pointer;
height: 112px;
padding: 6px;
}
.dialog-playlist li:hover {
background-color: #555555;
}
.dialog-playlist li img {
float: left;
height: 100px;
width: 100px;
}
.dialog-playlist li h2 {
margin-left: 125px;
font-size: 17px;
}
.dialog-backuplist {
padding-left: 0px;
text-align: left;
}
.dialog-backuplist li {
cursor: pointer;
height: 112px;
padding: 6px;
}
.dialog-backuplist li:hover {
background-color: #555555;
}
.dialog-backuplist li img {
float: left;
height: 100px;
width: 100px;
}
.dialog-backuplist li h2 {
margin-top: 10px;
margin-left: 125px;
font-size: 15px;
}
.dialog-merge-playlist {
padding-left: 0px;
text-align: left;
}
.dialog-merge-playlist li {
cursor: pointer;
height: 112px;
padding: 6px;
}
.dialog-merge-playlist li:hover {
background-color: #555555;
}
.dialog-merge-playlist li img {
float: left;
height: 100px;
width: 100px;
}
.dialog-merge-playlist li h2 {
margin-left: 125px;
font-size: 17px;
}
.dialog-newplaylist input {
margin-bottom: 22px;
}
.dialog-newplaylist .confirm-button {
margin-left: 76px;
margin-right: 96px;
}
.dialog-newbackup {
text-align: center;
}
.dialog-newbackup .confirm-button {
margin-right: 12px;
}
.dialog-editplaylist .dialog-footer {
position: absolute;
bottom: 20px;
}
.dialog-editplaylist .confirm-button,
.dialog-open-url .confirm-button {
margin-right: 82px;
margin-left: 93px;
}
.dialog-connect-lastfm .buttons {
margin-top: 30px;
}
.dialog-connect-lastfm .confirm-button {
margin-left: 40px;
margin-right: 48px;
}
.source-list {
position: absolute;
right: -32px;
top: 0px;
z-index: 10;
text-align: center;
}
.source-list div {
background-color: #333333;
color: #ffffff;
height: 35px;
border: 1px solid #ffffff;
width: 75px;
cursor: pointer;
vertical-align: middle;
padding-top: 6px;
}
.source-list div:first-child:not(:last-child) {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.source-list div:last-child:not(:first-child) {
border-top-left-radius: 0;
border-top-right-radius: 0;
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
}
.source-list .active {
background-color: #e6e6e6;
color: #333333;
}
.source-list div:hover {
background-color: #ffffff;
color: #333333;
}
.source-list .open-url-button {
border-radius: 4px;
}
.settings-title {
font-size: 20px;
padding: 20px;
border-bottom: 2px solid #aaaaaa;
}
.settings-content {
padding: 20px;
}
.settings-content .btn {
margin-right: 10px;
}
.btn-group button,
.btn-pagination,
.btn-pagination:focus {
background-color: #333333;
color: #ffffff;
border-color: #333333;
}
.btn-group button:hover,
.btn-pagination:hover {
background-color: #ffffff;
color: #333333;
}
.searchbox li > a:hover {
color: #333333;
}
.search-pagination {
text-align: center;
display: block;
vertical-align: middle;
line-height: 45px;
}
.search-pagination button:focus {
outline: 0;
}
.search-pagination label {
margin: 0 15px;
}
================================================
FILE: css/reset.css
================================================
html,
body,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
font,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-weight: normal;
font-style: normal;
font-size: 100%;
vertical-align: baseline;
}
:focus {
outline: 0;
}
body {
line-height: 1.2;
color: black;
background: white;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: 100%;
font-weight: normal;
}
ol,
ul {
list-style: none;
}
/* tables still need 'cellspacing="0"' in the markup */
table {
border-collapse: separate;
border-spacing: 0;
}
caption,
th,
td {
text-align: left;
font-weight: normal;
}
blockquote:before,
blockquote:after,
q:before,
q:after {
content: '';
}
blockquote,
q {
quotes: '' '';
}
img {
border: none;
}
================================================
FILE: i18n/en-US.json
================================================
{
"HELLO" : "hi",
"_ALL_MUSIC": "All Music",
"_NETEASE_MUSIC": "Netease",
"_QQ_MUSIC": "QQ",
"_XIAMI_MUSIC": "Xiami",
"_KUGOU_MUSIC": "Kugou",
"_KUWO_MUSIC": "Kuwo",
"_BILIBILI_MUSIC": "Bilibili",
"_MIGU_MUSIC": "Migu",
"_TAIHE_MUSIC": "Qianqian",
"_PLATFORM_UNION": "Platforms",
"_PLAYLISTS": "PLAYLISTS",
"_MY_MUSIC": "My Music",
"_CREATED_PLAYLIST": "My Playlist",
"_FAVORITED_PLAYLIST": "Favorite Playlist",
"_REFRESH_PLAYLIST": "Refresh Playlist",
"_FAVORITED": "Favorited",
"_FAVORITE": "Favorite",
"_PLAY_ALL": "Play All",
"_ADD_TO_PLAYLIST": "Add to Playlist",
"_EDIT": "Edit",
"_IMPORT": "Import",
"_IMPORT_PLAYLIST": "Import Playlist",
"_ORIGIN_LINK": "Origin link",
"_SONGS": "Songs",
"_ARTISTS": "Artists",
"_ALBUMS": "Albums",
"_OPERATION": "Tools",
"_CREATE_PLAYLIST": "Create Playlist",
"_CANCEL": "Cancel",
"_CREATE_AND_ADD_PLAYLIST": "Create and Add",
"_REMOVE_FROM_PLAYLIST": "Remove",
"_ADD_TO_QUEUE": "Add to Queue",
"_ARTIST": "Artist",
"_ALBUM": "Album",
"_PLAYLIST_TITLE": "Playlist Title",
"_PLAYLIST_AUTHOR": "Playlist Author",
"_PLAYLIST_SONG_COUNT": "Playlist Song Count",
"_PLAYLIST_COVER_IMAGE_URL": "Cover Image URL",
"_INPUT_PLAYLIST_TITLE": "Input Playlist Title",
"_INPUT_PLAYLIST_COVER_IMAGE_URL": "Input Cover Image URL",
"_EDIT_PLAYLIST": "Edit Playlist",
"_REMOVE_PLAYLIST": "Remove Playlist",
"_OPENING_LASTFM_PAGE":"Opening Last.fm页面...",
"_CONFIRM_NOTICE_LASTFM": "Please click \"Yes, all access\" in new page, allow Listen 1 access your account.",
"_AUTHORIZED_FINISHED": "Authorized Finished",
"_AUTHORIZED_REOPEN": "I Have Problem, try again",
"_PLAYLIST_LINK": "Playlist Link",
"_OPEN_PLAYLIST": "Open Playlist",
"_OPENING_GITHUB_PAGE": "Opening Github.com页面...",
"_CONFIRM_NOTICE_GITHUB": "Please click \"Authencate\" in new page, allow Listen 1 access your account",
"_CREATE_PLAYLIST_BACKUP": "Create Playlist Backup",
"_CREATE_PUBLIC_BACKUP": "Create Public Backup",
"_CREATE_PRIVATE_BACKUP": "Create Private Backup",
"_BACKUP_PLAYLIST": "Backup Playlists",
"_BACKUP_WARNING": "Reinstall or clear cache will lost all your playlists, backup is STRONG RECOMMENDED.",
"_EXPORT_TO_LOCAL_FILE": "Export to Local File",
"_EXPORT_TO_GITHUB_GIST": "Export to Github Gist",
"_RECOVER_PLAYLIST": "Recover Playlists",
"_RECOVER_WARNING": "Choose Backup File. Notice: It will overwrite current playlists.",
"_RECOVER_FROM_LOCAL_FILE": "Recover from Local File",
"_RECOVER_FROM_GITHUB_GIST": "Recover from Github Gist",
"_CONNECT_TO_GITHUB": "Connect to Github.com",
"_STATUS": "Status",
"_RECONNECT": "Reconnect",
"_CANCEL_CONNECT": "Cancel Connect",
"_SHORTCUTS": "Shortcuts",
"_VIEW_SHORTCUTS_LIST": "View Shortcuts List",
"_GLOBAL_SHORTCUTS_NOTICE": "Enable Global Shortcuts",
"_LYRIC_DISPLAY": "Lyric Display",
"_SHOW_DESKTOP_LYRIC": "Show desktop lyric",
"_SHOW_LYRIC_TRANSLATION": "Show lyric translation",
"_SHOW_DESKTOP_LYRIC_TRANSLATION": "Show lyric translation with desktop lyric",
"_CONNECT_TO_LASTFM": "Connect to Last.fm",
"_ABOUT": "About",
"_HOMEPAGE": "Homepage",
"_EMAIL": "Email",
"_FEEDBACK": "Feedback",
"_DESIGNER": "Designer",
"_VERSION": "Version",
"_LATEST_VERSION": "Latest Version",
"_LICENSE_NOTICE": "(This software is free and open source under MIT license)",
"_TOTAL_SONG_PREFIX": "Total ",
"_TOTAL_SONG_POSTFIX": " Songs",
"_CLEAR_ALL": "Clear All",
"_SEARCH_PLACEHOLDER": "Search",
"_LANGUAGE": "Language",
"_ADD_TO_PLAYLIST_SUCCESS": "Success: Add to My Playlist",
"_FAVORITE_PLAYLIST_SUCCESS": "Success: Favorite Playlist",
"_EDIT_PLAYLIST_SUCCESS": "Success: Edit Playlist",
"_IMPORTING_PLAYLIST": "Importing playlists...",
"_IMPORTING_PLAYLIST_SUCCESS": "Success: Import Playlists",
"_REMOVE_PLAYLIST_SUCCESS": "Success: Remove Playlist",
"_UNFAVORITE_PLAYLIST_SUCCESS": "Success: UnFavorite Playlist",
"_REMOVE_SONG_FROM_PLAYLIST_SUCCESS": "Success: Remove Song from Playlist",
"_ADD_TO_QUEUE_SUCCESS": "Success: Add to Queue",
"_COPYRIGHT_ISSUE": "Fail because copyright issue, Search other platform instead",
"_INPUT_NEW_PLAYLIST_TITLE": "Input New Playlist Title",
"_FAIL_OPEN_PLAYLIST_URL": "Fail to Open Playlist url",
"_EXAMPLE": "Example:",
"_CONFIRM": "Confirm",
"_THEME": "Theme",
"_THEME_WHITE": "White Theme",
"_THEME_BLACK": "Black Theme",
"_THEME_MODERN_WHITE": "Modern White Theme",
"_THEME_MODERN_BLACK": "Modern Black Theme",
"_AUTO_CHOOSE_SOURCE": "Auto Choose Source",
"_AUTO_CHOOSE_SOURCE_NOTICE": "Enable choose source from other music platform after fail.",
"_AUTO_CHOOSE_SOURCE_LIST": "Music Platform to try after fail",
"_NOWPLAYING_DISPLAY": "Now Playing Display",
"_NOWPLAYING_COVER_BACKGROUND_NOTICE": "Show Cover Image for Now Playing",
"_NOWPLAYING_BITRATE_NOTICE": "Show Bitrate",
"_NOWPLAYING_PLATFORM_NOTICE": "Show Music Platform",
"_LOCAL_MUSIC": "Local Music",
"_ADD_LOCAL_SONGS": "Add Local Songs",
"netease": "netease",
"bilibili": "bili",
"kugou": "kugou",
"kuwo": "kuwo",
"migu": "migu",
"qq": "qq",
"xiami": "xiami",
"taihe": "qianqian",
"localmusic": "local music",
"_CLOSE_TAB_ACTION": "Close tab action",
"_VALID_AFTER_RESTART": "Valid after restart",
"_QUIT_APPLICATION": "Quit Application",
"_MINIMIZE_TO_BACKGROUND": "Minimize to background",
"_MY_CREATED_PLAYLIST": "My Created Playlist",
"_MY_FAVORITE_PLAYLIST": "My Favorite Playlist",
"_RECOMMEND_PLAYLIST": "Recommend Playlist",
"_LISTEN1_LOGIN_NOTICE": "Listen1 WILL NOT transfer your account data to any server other than music platform server.",
"_PASSWORD": "Password",
"_LOGIN": "Login",
"_LOGOUT": "Logout",
"_LOGIN_ERROR": "Login error, please check user name and password",
"_LOGIN_EMAIL_ERROR": "Please enter correct email address",
"_LOGIN_COUNTRYCODE_ERROR": "Please enter correct country code",
"_LOGIN_PHONE_ERROR": "Please enter correct phone number",
"_LOGIN_PASSWORD_ERROR": "Password can't be empty",
"_LOGIN_NETEASE": "Login Netease",
"_LOGIN_BY_MOBILE_PHONE": "Login by mobile phone",
"_LOGIN_BY_EMAIL": "Login by email",
"_MOBILE_PHONE": "Mobile Phone",
"_MY_NETEASE": "My Netease",
"_MY_QQ": "My QQ Music",
"_FAIL_ALL_NOTICE": "No available track in current playlist",
"_SHORTCUTS_FUNCTION": "Shortcuts Function",
"_GLOBAL_SHORTCUTS": "Global Shortcuts",
"_PLAY_OR_PAUSE": "Play/Pause",
"_PREVIOUS_TRACK": "Previous Track",
"_NEXT_TRACK": "Next Track",
"_VOLUME_UP": "Volume Up",
"_VOLUME_DOWN": "Volume Down",
"_SHORTCUTS_NOT_SET": "N/A",
"_QUICK_SEARCH": "Quick Search",
"_SEARCH_PLAYLIST": "Search Playlist",
"_KEYBOARD_SPACE": "Space",
"_NOT_LOGIN_NICKNAME": "Anonymous",
"_LOGIN_DIALOG_NOTICE": "Opening Login page, please login in that page and click finish login",
"_LOGIN_SUCCESS": "Finish Login",
"_LOGIN_FAIL_RETRY": "Something wrong. Reopen Login page",
"_PROXY_SYSTEM": "Use System Proxy",
"_PROXY_DIRECT": "No Proxy",
"_PROXY_CUSTOM": "Custom Proxy",
"_PROXY_CONFIG": "Proxy Config",
"_PROXY_NOT_SET": "Proxy Not Set",
"_MODIFY": "Modify",
"_PROTOCOL": "Protocol",
"_HOST": "Host",
"_PORT": "Port",
"ZOOM_IN_OUT": "Zoom In/Out"
}
================================================
FILE: i18n/fr-FR.json
================================================
{
"HELLO" : "Bonjour",
"_ALL_MUSIC": "All Music",
"_NETEASE_MUSIC": "Netease",
"_QQ_MUSIC": "QQ",
"_XIAMI_MUSIC": "Xiami",
"_KUGOU_MUSIC": "Kugou",
"_KUWO_MUSIC": "Kuwo",
"_BILIBILI_MUSIC": "Bilibili",
"_MIGU_MUSIC": "Migu",
"_TAIHE_MUSIC": "Qianqian",
"_PLATFORM_UNION": "Platforms",
"_PLAYLISTS": "PLAYLISTS",
"_MY_MUSIC": "Ma Musique",
"_CREATED_PLAYLIST": "Ma Playlist",
"_FAVORITED_PLAYLIST": "Favorite Playlist",
"_REFRESH_PLAYLIST": "Refresh Playlist",
"_FAVORITED": "Favorited",
"_FAVORITE": "Favorite",
"_PLAY_ALL": "Lire tout",
"_ADD_TO_PLAYLIST": "Ajouter à la Playlist",
"_EDIT": "Editer",
"_IMPORT": "Importer",
"_IMPORT_PLAYLIST": "Importer la Playlist",
"_ORIGIN_LINK": "Lien original",
"_SONGS": "Musiques",
"_ARTISTS": "Artistes",
"_ALBUMS": "Albums",
"_OPERATION": "Outils",
"_CREATE_PLAYLIST": "Créer une Playlist",
"_CANCEL": "Annuler",
"_CREATE_AND_ADD_PLAYLIST": "Créer et ajouter",
"_REMOVE_FROM_PLAYLIST": "Retirer",
"_ADD_TO_QUEUE": "Ajouter à la liste de lecture",
"_ARTIST": "Artiste",
"_ALBUM": "Album",
"_PLAYLIST_TITLE": "Titre de la Playlist",
"_PLAYLIST_AUTHOR": "Playlist Author",
"_PLAYLIST_SONG_COUNT": "Playlist Song Count",
"_PLAYLIST_COVER_IMAGE_URL": "URL de la pochette",
"_INPUT_PLAYLIST_TITLE": "Inserez le titre de la playlist",
"_INPUT_PLAYLIST_COVER_IMAGE_URL": "Entrez l'URL de la pochette",
"_EDIT_PLAYLIST": "Editer la playlist",
"_REMOVE_PLAYLIST": "Supprimer la Playlist",
"_OPENING_LASTFM_PAGE":"Ouverture de Last.fm页面...",
"_CONFIRM_NOTICE_LASTFM": "Cliquez sur \"Oui, tout autoriser\" dans la nouvelle page, autoriser l'accès à votre compte.",
"_AUTHORIZED_FINISHED": "Autorisation finie",
"_AUTHORIZED_REOPEN": "J'ai un problème, veuillez réessayer",
"_PLAYLIST_LINK": "Lien de la playslit",
"_OPEN_PLAYLIST": "Ouvrir la laylist",
"_OPENING_GITHUB_PAGE": "Ouverture de Github.com页面...",
"_CONFIRM_NOTICE_GITHUB": "Cliquez sur \"S'identifier\" dans la nouvelle page, autoriser l'accès à votre compte.",
"_CREATE_PLAYLIST_BACKUP": "Créer une sauvegarde de playslist",
"_CREATE_PUBLIC_BACKUP": "Créer une sauvegarde public de playslist",
"_CREATE_PRIVATE_BACKUP": "Créer une sauvegarde privée de playslist",
"_BACKUP_PLAYLIST": "Sauvegardes de playslite",
"_BACKUP_WARNING": "Réinstallez ou effacez votre cache vous fera perdre toutes vos playlists, les sauvegardes sont recommandés.",
"_EXPORT_TO_LOCAL_FILE": "Exporter vers un fichier local",
"_EXPORT_TO_GITHUB_GIST": "Exporter vers un Github Gist",
"_RECOVER_PLAYLIST": "Récuperer une playlist",
"_RECOVER_WARNING": "Séléctionner un fichier de sauvegarde. Notice: Elle remplacera la playliste actuelle.",
"_RECOVER_FROM_LOCAL_FILE": "Récuperer par un fichier local",
"_RECOVER_FROM_GITHUB_GIST": "Récuperer par un Github Gist",
"_CONNECT_TO_GITHUB": "Connecter à Github.com",
"_STATUS": "Statut",
"_RECONNECT": "Reconnecter",
"_CANCEL_CONNECT": "Annuler la connexion",
"_SHORTCUTS": "Raccourcis",
"_VIEW_SHORTCUTS_LIST": "Voir la liste des raccourcis",
"_GLOBAL_SHORTCUTS_NOTICE": "Activer les raccourcis généraux",
"_LYRIC_DISPLAY": "Affichage des parole",
"_SHOW_DESKTOP_LYRIC": "Afficher les parole du bureau",
"_SHOW_LYRIC_TRANSLATION": "Affiche la traduction des paroles",
"_SHOW_DESKTOP_LYRIC_TRANSLATION": "Afficher les traductions de paroles du bureau",
"_CONNECT_TO_LASTFM": "Ouverture de Last.fm",
"_ABOUT": "A Propos",
"_HOMEPAGE": "Accueil",
"_EMAIL": "Email",
"_FEEDBACK": "Feedback",
"_DESIGNER": "Designer",
"_VERSION": "Version",
"_LATEST_VERSION": "Latest Version",
"_LICENSE_NOTICE": "(Ce programme est gratuit et tout license MIT)",
"_TOTAL_SONG_PREFIX": "Total ",
"_TOTAL_SONG_POSTFIX": " Morceaux",
"_CLEAR_ALL": "Tout effacer",
"_SEARCH_PLACEHOLDER": "Recherche",
"_LANGUAGE": "Langage",
"_ADD_TO_PLAYLIST_SUCCESS": "Succès: Ajouter à la Playlist",
"_FAVORITE_PLAYLIST_SUCCESS": "Success: Favorite Playlist",
"_EDIT_PLAYLIST_SUCCESS": "Succès: Editer la Playlist",
"_IMPORTING_PLAYLIST": "Importation des playlists...",
"_IMPORTING_PLAYLIST_SUCCESS": "Succès: Importer les Playlists",
"_REMOVE_PLAYLIST_SUCCESS": "Succès: Effacer Playlist",
"_UNFAVORITE_PLAYLIST_SUCCESS": "Succès: UnFavorite Playlist",
"_REMOVE_SONG_FROM_PLAYLIST_SUCCESS": "Succès: Retirer la morceau de la Playlist",
"_ADD_TO_QUEUE_SUCCESS": "Succès: Ajouter à la file de lecture",
"_COPYRIGHT_ISSUE": "Errur due au copyright, Cherchez sur une autre plateforme",
"_INPUT_NEW_PLAYLIST_TITLE": "Entrez un nouveau titre de Playlist",
"_FAIL_OPEN_PLAYLIST_URL": "Erreur ouverture de l'url",
"_EXAMPLE": "Exemple:",
"_CONFIRM": "Confirmer",
"_THEME": "Thème",
"_THEME_WHITE": "Thème blanc",
"_THEME_BLACK": "Thème foncé",
"_THEME_MODERN_WHITE": "Modern White Theme",
"_THEME_MODERN_BLACK": "Modern Black Theme",
"_AUTO_CHOOSE_SOURCE": "Auto Choose Source",
"_AUTO_CHOOSE_SOURCE_NOTICE": "If play fail, auto choose source from other music platform.",
"_AUTO_CHOOSE_SOURCE_LIST": "Music Platform to try after fail",
"_NOWPLAYING_DISPLAY": "Now Playing Display",
"_NOWPLAYING_COVER_BACKGROUND_NOTICE": "Show Cover Image for Now Playing",
"_NOWPLAYING_BITRATE_NOTICE": "Show Bitrate",
"_NOWPLAYING_PLATFORM_NOTICE": "Show Music Platform",
"_LOCAL_MUSIC": "Local Music",
"_ADD_LOCAL_SONGS": "Add Local Songs",
"netease": "netease",
"bilibili": "bili",
"kugou": "kugou",
"kuwo": "kuwo",
"migu": "migu",
"qq": "qq",
"xiami": "xiami",
"taihe": "qianqian",
"localmusic": "local music",
"_CLOSE_TAB_ACTION": "Close tab action",
"_VALID_AFTER_RESTART": "Valid after restart",
"_QUIT_APPLICATION": "Quit Application",
"_MINIMIZE_TO_BACKGROUND": "Minimize to background",
"_MY_CREATED_PLAYLIST": "My Created Playlist",
"_MY_FAVORITE_PLAYLIST": "My Favorite Playlist",
"_RECOMMEND_PLAYLIST": "Recommend Playlist",
"_LISTEN1_LOGIN_NOTICE": "Listen1 NE transférera PAS les données de votre compte vers un serveur autre que le serveur de la plate-forme musicale.",
"_PASSWORD": "Password",
"_LOGIN": "Login",
"_LOGOUT": "Logout",
"_LOGIN_ERROR": "Login error, please check user name and password",
"_LOGIN_EMAIL_ERROR": "Please enter correct email address",
"_LOGIN_COUNTRYCODE_ERROR": "Please enter correct country code",
"_LOGIN_PHONE_ERROR": "Please enter correct phone number",
"_LOGIN_PASSWORD_ERROR": "Password can't be empty",
"_LOGIN_NETEASE": "Login Netease",
"_LOGIN_BY_MOBILE_PHONE": "Login by mobile phone",
"_LOGIN_BY_EMAIL": "Login by email",
"_MOBILE_PHONE": "Mobile Phone",
"_MY_NETEASE": "My Netease",
"_MY_QQ": "My QQ Music",
"_FAIL_ALL_NOTICE": "No available track in current playlist",
"_SHORTCUTS_FUNCTION": "Shortcuts Function",
"_GLOBAL_SHORTCUTS": "Global Raccourcis",
"_PLAY_OR_PAUSE": "Play/Pause",
"_PREVIOUS_TRACK": "Previous Track",
"_NEXT_TRACK": "Next Track",
"_VOLUME_UP": "Volume Up",
"_VOLUME_DOWN": "Volume Down",
"_SHORTCUTS_NOT_SET": "N/A",
"_QUICK_SEARCH": "Quick Search",
"_SEARCH_PLAYLIST": "Search Playlist",
"_KEYBOARD_SPACE": "Space",
"_NOT_LOGIN_NICKNAME": "Anonymous",
"_LOGIN_DIALOG_NOTICE": "Opening Login page, please login in that page and click finish login",
"_LOGIN_SUCCESS": "Finish Login",
"_LOGIN_FAIL_RETRY": "Something wrong. Reopen Login page",
"_PROXY_SYSTEM": "Use System Proxy",
"_PROXY_DIRECT": "No Proxy",
"_PROXY_CUSTOM": "Custom Proxy",
"_PROXY_CONFIG": "Proxy Config",
"_PROXY_NOT_SET": "Proxy Not Set",
"_MODIFY": "Modify",
"_PROTOCOL": "Protocol",
"_HOST": "Host",
"_PORT": "Port",
"ZOOM_IN_OUT": "Zoom In/Out"
}
================================================
FILE: i18n/ko-KR.json
================================================
{
"HELLO": "안녕하세요",
"_ALL_MUSIC": "모든 음악",
"_NETEASE_MUSIC": "Netease",
"_QQ_MUSIC": "QQ",
"_XIAMI_MUSIC": "Xiami",
"_KUGOU_MUSIC": "Kugou",
"_KUWO_MUSIC": "Kuwo",
"_BILIBILI_MUSIC": "Bilibili",
"_MIGU_MUSIC": "Migu",
"_TAIHE_MUSIC": "Qianqian",
"_PLATFORM_UNION": "전체 사이트",
"_PLAYLISTS": "재생목록",
"_MY_MUSIC": "내 음악",
"_CREATED_PLAYLIST": "내 재생목록",
"_FAVORITED_PLAYLIST": "좋아하는 재생목록",
"_REFRESH_PLAYLIST": "갱신 재생목록",
"_FAVORITED": "즐겨찾음",
"_FAVORITE": "즐겨찾기",
"_PLAY_ALL": "전체 재생",
"_ADD_TO_PLAYLIST": "재생목록 추가",
"_EDIT": "수정",
"_IMPORT": "추가",
"_IMPORT_PLAYLIST": "추가 재생목록",
"_ORIGIN_LINK": "원본 링크",
"_SONGS": "음악",
"_ARTISTS": "가수",
"_ALBUMS": "앨범",
"_OPERATION": "도구",
"_CREATE_PLAYLIST": "재생목록 생성",
"_CANCEL": "취소",
"_CREATE_AND_ADD_PLAYLIST": "생성 및 추가",
"_REMOVE_FROM_PLAYLIST": "제거",
"_ADD_TO_QUEUE": "목록 추가",
"_ARTIST": "가수",
"_ALBUM": "앨범",
"_PLAYLIST_TITLE": "재생목록 이름",
"_PLAYLIST_AUTHOR": "재생목록 생성자",
"_PLAYLIST_SONG_COUNT": "재생목록 음악 수",
"_PLAYLIST_COVER_IMAGE_URL": "커버 사진 URL",
"_INPUT_PLAYLIST_TITLE": "재생목록 이름 입력",
"_INPUT_PLAYLIST_COVER_IMAGE_URL": "커버 사진 URL 입력",
"_EDIT_PLAYLIST": "재생목록 수정",
"_REMOVE_PLAYLIST": "재생목록 제거",
"_OPENING_LASTFM_PAGE": "Last.fm 여는중...",
"_CONFIRM_NOTICE_LASTFM": "\"Yes, all access\" 을 클릭하여 Listen 1 이 계정에 접근 할 수 있도록 허용 해주세요.",
"_AUTHORIZED_FINISHED": "인증 완료",
"_AUTHORIZED_REOPEN": "문제 발생, 다시 시도 하세요",
"_PLAYLIST_LINK": "재생목록 링크",
"_OPEN_PLAYLIST": "재생목록 열기",
"_OPENING_GITHUB_PAGE": "Github.com 여는중...",
"_CONFIRM_NOTICE_GITHUB": "\"Authencate\" 을 클릭하여 Listen 1 이 계정에 접근 할 수 있도록 허용 해주세요",
"_CREATE_PLAYLIST_BACKUP": "재생목록 백업 생성",
"_CREATE_PUBLIC_BACKUP": "공개 백업 생성",
"_CREATE_PRIVATE_BACKUP": "비공개 백업 생성",
"_BACKUP_PLAYLIST": "백업 재생목록",
"_BACKUP_WARNING": "캐시를 다시 설치하거나 지우면 모든 재생 목록이 손실됩니다. 백업을 권장 합니다",
"_EXPORT_TO_LOCAL_FILE": "로컬 파일 내보내기",
"_EXPORT_TO_GITHUB_GIST": "Github Gist 내보내기",
"_RECOVER_PLAYLIST": "재생 목록 복구",
"_RECOVER_WARNING": "백업 파일을 선택합니다. 알림: 현재 재생 목록을 덮어씁니다.",
"_RECOVER_FROM_LOCAL_FILE": "로컬 파일 복구",
"_RECOVER_FROM_GITHUB_GIST": "Github Gist 복구",
"_CONNECT_TO_GITHUB": "Github.com 연결",
"_STATUS": "상태",
"_RECONNECT": "재접속",
"_CANCEL_CONNECT": "접속 취소",
"_SHORTCUTS": "단축키",
"_VIEW_SHORTCUTS_LIST": "단축키 리스트 보기",
"_GLOBAL_SHORTCUTS_NOTICE": "전역 단축키 활성",
"_LYRIC_DISPLAY": "가사 표시",
"_SHOW_DESKTOP_LYRIC": "바탕화면 가사 표시",
"_SHOW_LYRIC_TRANSLATION": "외국어 가사 번역 표시",
"_SHOW_DESKTOP_LYRIC_TRANSLATION": "외국어 가사 번역 및 바탕화면 표시",
"_CONNECT_TO_LASTFM": "Last.fm 연결",
"_ABOUT": "소개",
"_HOMEPAGE": "홈페이지",
"_EMAIL": "Email",
"_FEEDBACK": "Feedback",
"_DESIGNER": "디자이너",
"_VERSION": "버전",
"_LATEST_VERSION": "마지막 버전",
"_LICENSE_NOTICE": "(This software is free and open source under MIT license)",
"_TOTAL_SONG_PREFIX": "전체 ",
"_TOTAL_SONG_POSTFIX": " 음악",
"_CLEAR_ALL": "모두 지우기",
"_SEARCH_PLACEHOLDER": "검색",
"_LANGUAGE": "언어",
"_ADD_TO_PLAYLIST_SUCCESS": "성공: 내 재생 목록에 추가",
"_FAVORITE_PLAYLIST_SUCCESS": "성공: 즐겨찾기 재생 목록",
"_EDIT_PLAYLIST_SUCCESS": "성공: 재생 목록 편집",
"_IMPORTING_PLAYLIST": "재생 목록 가져오기...",
"_IMPORTING_PLAYLIST_SUCCESS": "성공: 재생 목록 가져오기",
"_REMOVE_PLAYLIST_SUCCESS": "성공: 재생 목록 제거",
"_UNFAVORITE_PLAYLIST_SUCCESS": "성공: 재생 목록 즐겨찾기 취소",
"_REMOVE_SONG_FROM_PLAYLIST_SUCCESS": "성공: 재생 목록에서 음악 제거",
"_ADD_TO_QUEUE_SUCCESS": "성공: 재생 목록에 추가",
"_COPYRIGHT_ISSUE": "저작권 문제로 인해 실패, 대신 다른 플랫폼 검색",
"_INPUT_NEW_PLAYLIST_TITLE": "새 재생 목록 제목 입력",
"_FAIL_OPEN_PLAYLIST_URL": "재생 목록 URL을 열지 못함",
"_EXAMPLE": "예제:",
"_CONFIRM": "확인",
"_THEME": "테마",
"_THEME_WHITE": "하얀색 테마",
"_THEME_BLACK": "검색은 테마",
"_THEME_MODERN_WHITE": "Modern White Theme",
"_THEME_MODERN_BLACK": "Modern Black Theme",
"_AUTO_CHOOSE_SOURCE": "소스 자동 선택",
"_AUTO_CHOOSE_SOURCE_NOTICE": "재생 소스 자동 전환 여부 (음악 재생 실패 후에만 전환)",
"_AUTO_CHOOSE_SOURCE_LIST": "실패 후 시도할 음악 플랫폼",
"_NOWPLAYING_DISPLAY": "재생 중 표시",
"_NOWPLAYING_COVER_BACKGROUND_NOTICE": "지금 재생 중인 커버 이미지 표시",
"_NOWPLAYING_BITRATE_NOTICE": "비트 레이트 보이기",
"_NOWPLAYING_PLATFORM_NOTICE": "음악 플랫폼 표시",
"_LOCAL_MUSIC": "로컬 음악",
"_ADD_LOCAL_SONGS": "로컬 음악 추가",
"netease": "netease",
"bilibili": "bili",
"kugou": "kugou",
"kuwo": "kuwo",
"migu": "migu",
"qq": "qq",
"xiami": "xiami",
"taihe": "qianqian",
"localmusic": "로컬 음악",
"_CLOSE_TAB_ACTION": "탭 닫기 동작",
"_VALID_AFTER_RESTART": "다시 시작 후에 동작",
"_QUIT_APPLICATION": "응용 프로그램 종료",
"_MINIMIZE_TO_BACKGROUND": "배경으로 최소화",
"_MY_CREATED_PLAYLIST": "내가 만든 재생 목록",
"_MY_FAVORITE_PLAYLIST": "내가 소장 재생 목록",
"_RECOMMEND_PLAYLIST": "추천 재생 목록",
"_LISTEN1_LOGIN_NOTICE": "Listen1은 음악 플랫폼 서버 이외의 서버로 계정 데이터를 전송하지 않습니다.",
"_PASSWORD": "패스워드",
"_LOGIN": "로그인",
"_LOGOUT": "로그아웃",
"_LOGIN_ERROR": "로그인 오류. 아이디, 패스워드를 확인 하세요.",
"_LOGIN_EMAIL_ERROR": "올바른 이메일 주소를 입력하십시오.",
"_LOGIN_COUNTRYCODE_ERROR": "올바른 국가 코드를 입력하십시오.",
"_LOGIN_PHONE_ERROR": "올바른 전화번호를 입력하십시오.",
"_LOGIN_PASSWORD_ERROR": "암호는 비워 둘 수 없습니다.",
"_LOGIN_NETEASE": "Netease 로그인",
"_LOGIN_BY_MOBILE_PHONE": "휴대폰으로 로그인",
"_LOGIN_BY_EMAIL": "이메일로 로그인",
"_MOBILE_PHONE": "휴대폰",
"_MY_NETEASE": "내 Netease",
"_MY_QQ": "내 QQ 음악",
"_FAIL_ALL_NOTICE": "현재 재생 목록에 재생 가능한 곡이 없습니다.",
"_SHORTCUTS_FUNCTION": "단축키 기능",
"_GLOBAL_SHORTCUTS": "전역 단축키",
"_PLAY_OR_PAUSE": "재생/일시 중지",
"_PREVIOUS_TRACK": "이전 음악",
"_NEXT_TRACK": "다음 음악",
"_VOLUME_UP": "사운드 크게",
"_VOLUME_DOWN": "사운드 작게",
"_SHORTCUTS_NOT_SET": "N/A",
"_QUICK_SEARCH": "빠른 검색",
"_SEARCH_PLAYLIST": "재생 목록 검색",
"_KEYBOARD_SPACE": "스페이스",
"_NOT_LOGIN_NICKNAME": "익명",
"_LOGIN_DIALOG_NOTICE": "그인 페이지를 여는 중입니다. 해당 페이지에 로그인하고 로그인 완료를 클릭하십시오.",
"_LOGIN_SUCCESS": "로그인 완료",
"_LOGIN_FAIL_RETRY": "로그인에 문제가 생기면 로그인 페이지를 다시 엽니다.",
"_PROXY_SYSTEM": "시스템 Proxy 사용",
"_PROXY_DIRECT": "Proxy 미사용",
"_PROXY_CUSTOM": "사용자 Proxy",
"_PROXY_CONFIG": "Proxy 설정",
"_PROXY_NOT_SET": "Proxy가 설정되지 않음",
"_MODIFY": "수정",
"_PROTOCOL": "Protocol",
"_HOST": "Host",
"_PORT": "Port",
"ZOOM_IN_OUT": "확대/축소"
}
================================================
FILE: i18n/pt-BR.json
================================================
{
"HELLO" : "Olá",
"_ALL_MUSIC": "Todas as músicas",
"_NETEASE_MUSIC": "Netease",
"_QQ_MUSIC": "QQ",
"_XIAMI_MUSIC": "Xiami",
"_KUGOU_MUSIC": "Kugou",
"_KUWO_MUSIC": "Kuwo",
"_BILIBILI_MUSIC": "Bilibili",
"_MIGU_MUSIC": "Migu",
"_TAIHE_MUSIC": "Qianqian",
"_PLATFORM_UNION": "Plataformas",
"_PLAYLISTS": "PLAYLISTS",
"_MY_MUSIC": "Minha música",
"_CREATED_PLAYLIST": "Minha Playlist",
"_FAVORITED_PLAYLIST": "Playlist Favorita",
"_REFRESH_PLAYLIST": "Playlist Recarregar",
"_FAVORITED": "Favoritado",
"_FAVORITE": "Favorito",
"_PLAY_ALL": "Tocar todas",
"_ADD_TO_PLAYLIST": "Adicionar pra Playlist",
"_EDIT": "Editar",
"_IMPORT": "Importar",
"_IMPORT_PLAYLIST": "Importar Playlist",
"_ORIGIN_LINK": "Link de Origem",
"_SONGS": "Músicas",
"_ARTISTS": "Artistas",
"_ALBUMS": "Álbuns",
"_OPERATION": "Ferramentas",
"_CREATE_PLAYLIST": "Criar Playlist",
"_CANCEL": "Cancelar",
"_CREATE_AND_ADD_PLAYLIST": "Criar e adicionar",
"_REMOVE_FROM_PLAYLIST": "Remover",
"_ADD_TO_QUEUE": "Adicionar à fila",
"_ARTIST": "Artista",
"_ALBUM": "Álbum",
"_PLAYLIST_TITLE": "Título da Playlist",
"_PLAYLIST_AUTHOR": "Autor da Playlist",
"_PLAYLIST_SONG_COUNT": "Quantidade de Músicas na Playlist",
"_PLAYLIST_COVER_IMAGE_URL": "URL da Imagem da Capa",
"_INPUT_PLAYLIST_TITLE": "Insira o Título da Lista de Reprodução",
"_INPUT_PLAYLIST_COVER_IMAGE_URL": "Insira a URL da Imagem da Capa",
"_EDIT_PLAYLIST": "Editar Playlist",
"_REMOVE_PLAYLIST": "Remover Playlist",
"_OPENING_LASTFM_PAGE":"Abrindo Last.fm...",
"_CONFIRM_NOTICE_LASTFM": "Por favor, clique em \"Sim, todo acesso\" na nova página, permite que o Listen 1 acesse sua conta.",
"_AUTHORIZED_FINISHED": "Autorização finalizada",
"_AUTHORIZED_REOPEN": "Estou com um problema, tente novamente",
"_PLAYLIST_LINK": "Link da Playlist",
"_OPEN_PLAYLIST": "Abrir Playlist",
"_OPENING_GITHUB_PAGE": "Abrindo Github.com...",
"_CONFIRM_NOTICE_GITHUB": "Por favor, clique em \"Autenticar\" na nova página, permite que o Listen 1 acesse sua conta.",
"_CREATE_PLAYLIST_BACKUP": "Criar Backup da Playlist ",
"_CREATE_PUBLIC_BACKUP": "Criar Backup Público",
"_CREATE_PRIVATE_BACKUP": "Criar Backup Privado",
"_BACKUP_PLAYLIST": "Backup Playlists",
"_BACKUP_WARNING": "Reinstalar ou limpar o cache perderá todas as suas listas de reprodução, o backup é FORTEMENTE RECOMENDADO.",
"_EXPORT_TO_LOCAL_FILE": "Exportar para um arquivo local",
"_EXPORT_TO_GITHUB_GIST": "Exportar para Github Gist",
"_RECOVER_PLAYLIST": "Recuperar Playlists",
"_RECOVER_WARNING": "Escolha o arquivo de backup. Aviso: Ele substituirá as listas de reprodução atuais.",
"_RECOVER_FROM_LOCAL_FILE": "Recuperar de um arquivo local",
"_RECOVER_FROM_GITHUB_GIST": "Recuperar do Github Gist",
"_CONNECT_TO_GITHUB": "Conectar com Github.com",
"_STATUS": "Status",
"_RECONNECT": "Reconectar",
"_CANCEL_CONNECT": "Cancelar conexão",
"_SHORTCUTS": "Atalhos",
"_VIEW_SHORTCUTS_LIST": "Ver Lista de Atalhos",
"_GLOBAL_SHORTCUTS_NOTICE": "Habilitar Atalhos Globais",
"_LYRIC_DISPLAY": "Exibição de letra",
"_SHOW_DESKTOP_LYRIC": "Mostrar letra da área de trabalho",
"_SHOW_LYRIC_TRANSLATION": "Mostrar tradução da letra",
"_SHOW_DESKTOP_LYRIC_TRANSLATION": "Mostrar a tradução da letra com a letra da área de trabalho",
"_CONNECT_TO_LASTFM": "Conectar à Last.fm",
"_ABOUT": "Sobre",
"_HOMEPAGE": "Página Inicial",
"_EMAIL": "Email",
"_FEEDBACK": "Feedback",
"_DESIGNER": "Designer",
"_VERSION": "Versão",
"_LATEST_VERSION": "Última versão",
"_LICENSE_NOTICE": "(Este software é gratuito e de código aberto sob licença do MIT)",
"_TOTAL_SONG_PREFIX": "Total ",
"_TOTAL_SONG_POSTFIX": " Músicas",
"_CLEAR_ALL": "Limpar Tudo",
"_SEARCH_PLACEHOLDER": "Pesquisar",
"_LANGUAGE": "Língua",
"_ADD_TO_PLAYLIST_SUCCESS": "Sucesso: Adicionar em minha Playlist",
"_FAVORITE_PLAYLIST_SUCCESS": "Sucesso: Favoritar Playlist",
"_EDIT_PLAYLIST_SUCCESS": "Sucesso: Editar Playlist",
"_IMPORTING_PLAYLIST": "Importando playlists...",
"_IMPORTING_PLAYLIST_SUCCESS": "Sucesso: Importar Playlists",
"_REMOVE_PLAYLIST_SUCCESS": "Sucesso: Remover playlist",
"_UNFAVORITE_PLAYLIST_SUCCESS": "Sucesso: Desfavoritar playlist",
"_REMOVE_SONG_FROM_PLAYLIST_SUCCESS": "Sucesso: Remover música da playlist",
"_ADD_TO_QUEUE_SUCCESS": "Sucesso: Adicionar à fila",
"_COPYRIGHT_ISSUE": "Falha devido ao problema de direitos autorais. Pesquise em outra plataforma",
"_INPUT_NEW_PLAYLIST_TITLE": "Insira o novo título Playlist",
"_FAIL_OPEN_PLAYLIST_URL": "Falha em abrir o link da playlist",
"_EXAMPLE": "Exemplo:",
"_CONFIRM": "Confirmar",
"_THEME": "Tema",
"_THEME_WHITE": "Tema Claro",
"_THEME_BLACK": "Tema Escuro",
"_THEME_MODERN_WHITE": "Tema Modern White",
"_THEME_MODERN_BLACK": "Tema Modern Black",
"_AUTO_CHOOSE_SOURCE": "Escolha automática da fonte",
"_AUTO_CHOOSE_SOURCE_NOTICE": "Ative a escolha da fonte de outra plataforma de música após a falha.",
"_AUTO_CHOOSE_SOURCE_LIST": "Plataforma de música para tentar depois de falhar",
"_NOWPLAYING_DISPLAY": "Tocando agora",
"_NOWPLAYING_COVER_BACKGROUND_NOTICE": "Mostrar a imagem da capa para Tocando agora",
"_NOWPLAYING_BITRATE_NOTICE": "Mostrar Bitrate",
"_NOWPLAYING_PLATFORM_NOTICE": "Mostrar Plataforma da Música ",
"_LOCAL_MUSIC": "Música Locas",
"_ADD_LOCAL_SONGS": "Adicionar músicas locais",
"netease": "netease",
"bilibili": "bili",
"kugou": "kugou",
"kuwo": "kuwo",
"migu": "migu",
"qq": "qq",
"xiami": "xiami",
"taihe": "qianqian",
"localmusic": "música local",
"_CLOSE_TAB_ACTION": "Fechar guia",
"_VALID_AFTER_RESTART": "Válidar após reiniciar",
"_QUIT_APPLICATION": "Sair da aplicação",
"_MINIMIZE_TO_BACKGROUND": "Minimizar para segundo plano",
"_MY_CREATED_PLAYLIST": "Minhas Playlist Criadas",
"_MY_FAVORITE_PLAYLIST": "Minhas Playlist Favoritas",
"_RECOMMEND_PLAYLIST": "Playlists Recomendadas",
"_LISTEN1_LOGIN_NOTICE": "Listen1 NÃO transferirá os dados da sua conta para nenhum servidor que não seja o servidor da plataforma de música.",
"_PASSWORD": "Senha",
"_LOGIN": "Login",
"_LOGOUT": "Sair",
"_LOGIN_ERROR": "Erro no login, por favor confira se as informações estão corretas",
"_LOGIN_EMAIL_ERROR": "Por favor insira um email válido",
"_LOGIN_COUNTRYCODE_ERROR": "Por favor insira o código de país correto",
"_LOGIN_PHONE_ERROR": "Por favor insira um número de celular válido",
"_LOGIN_PASSWORD_ERROR": "A senha não pode estar vazia",
"_LOGIN_NETEASE": "Login Netease",
"_LOGIN_BY_MOBILE_PHONE": "Login por Celular",
"_LOGIN_BY_EMAIL": "Login por Email",
"_MOBILE_PHONE": "Celular",
"_MY_NETEASE": "Meu Netease",
"_MY_QQ": "Meu QQ Music",
"_FAIL_ALL_NOTICE": "Nenhuma faixa disponível na playlist atual",
"_SHORTCUTS_FUNCTION": "Função dos atalhos",
"_GLOBAL_SHORTCUTS": "Atalhos globais",
"_PLAY_OR_PAUSE": "Play/Pause",
"_PREVIOUS_TRACK": "Faixa anterior",
"_NEXT_TRACK": "Próxima faixa",
"_VOLUME_UP": "Volume Up",
"_VOLUME_DOWN": "Volume Down",
"_SHORTCUTS_NOT_SET": "N/A",
"_QUICK_SEARCH": "Pesquisa Rápida",
"_SEARCH_PLAYLIST": "Procurar Playlist",
"_KEYBOARD_SPACE": "Espaço",
"_NOT_LOGIN_NICKNAME": "Anônimo",
"_LOGIN_DIALOG_NOTICE": "Abrindo a página de login, faça o login nessa página e clique em concluir o login",
"_LOGIN_SUCCESS": "Concluir o login",
"_LOGIN_FAIL_RETRY": "Algo deu errado. Reabra a página de login",
"_PROXY_SYSTEM": "Usar Proxy do Sistema",
"_PROXY_DIRECT": "Sem proxy",
"_PROXY_CUSTOM": "Proxy personalizado",
"_PROXY_CONFIG": "Configuração de proxy",
"_PROXY_NOT_SET": "Proxy não definido",
"_MODIFY": "Modificar",
"_PROTOCOL": "Protocolo",
"_HOST": "Host",
"_PORT": "Porta",
"ZOOM_IN_OUT": "Ampliar/Reduzir"
}
================================================
FILE: i18n/zh-CN.json
================================================
{
"HELLO" : "你好",
"_ALL_MUSIC": "所有音乐",
"_NETEASE_MUSIC": "网易云音乐",
"_QQ_MUSIC": "QQ音乐",
"_XIAMI_MUSIC": "虾米音乐",
"_KUGOU_MUSIC": "酷狗音乐",
"_KUWO_MUSIC": "酷我音乐",
"_BILIBILI_MUSIC": "哔哩哔哩",
"_MIGU_MUSIC": "咪咕音乐",
"_TAIHE_MUSIC": "千千音乐",
"_PLATFORM_UNION": "平台聚合",
"_PLAYLISTS": "精选歌单",
"_MY_MUSIC": "我的音乐",
"_CREATED_PLAYLIST": "创建的歌单",
"_FAVORITED_PLAYLIST": "收藏的歌单",
"_REFRESH_PLAYLIST": "刷新",
"_FAVORITED": "已收藏",
"_FAVORITE": "收藏",
"_PLAY_ALL": "播放全部",
"_ADD_TO_PLAYLIST": "添加到我的歌单",
"_EDIT": "编辑",
"_IMPORT": "导入",
"_IMPORT_PLAYLIST": "导入歌单",
"_ORIGIN_LINK": "链接",
"_SONGS": "歌曲名",
"_ARTISTS": "歌手",
"_ALBUMS": "专辑名",
"_OPERATION": "操作",
"_CREATE_PLAYLIST": "新建歌单",
"_CANCEL": "取消",
"_CREATE_AND_ADD_PLAYLIST": "创建并添加",
"_REMOVE_FROM_PLAYLIST": "从歌单删除",
"_ADD_TO_QUEUE": "添加到当前播放",
"_ARTIST": "歌手",
"_ALBUM": "专辑名",
"_PLAYLIST_TITLE": "歌单名称",
"_PLAYLIST_AUTHOR": "歌单作者",
"_PLAYLIST_SONG_COUNT": "歌曲数",
"_PLAYLIST_COVER_IMAGE_URL": "封面图片url",
"_INPUT_PLAYLIST_TITLE": "输入歌单名称",
"_INPUT_PLAYLIST_COVER_IMAGE_URL": "输入封面URL",
"_EDIT_PLAYLIST": "编辑歌单",
"_REMOVE_PLAYLIST": "删除歌单",
"_OPENING_LASTFM_PAGE":"正在打开Last.fm页面...",
"_CONFIRM_NOTICE_LASTFM": "请在打开的页面点击\"Yes, all access\", 允许Listen 1访问你的账户。",
"_AUTHORIZED_FINISHED": "已经完成授权",
"_AUTHORIZED_REOPEN": "遇到问题,再次打开授权页",
"_PLAYLIST_LINK": "歌单链接",
"_OPEN_PLAYLIST": "打开歌单",
"_OPENING_GITHUB_PAGE": "正在打开Github.com页面...",
"_CONFIRM_NOTICE_GITHUB": "请在打开的页面点击\"Authencate\", 允许Listen 1访问你的账户。",
"_CREATE_PLAYLIST_BACKUP": "创建歌单备份",
"_CREATE_PUBLIC_BACKUP": "创建公开备份",
"_CREATE_PRIVATE_BACKUP": "创建私有备份",
"_BACKUP_PLAYLIST": "备份歌单",
"_BACKUP_WARNING": "重装插件或清除缓存数据会导致我的歌单数据丢失,强烈建议在这些操作前,备份我的歌单。",
"_EXPORT_TO_LOCAL_FILE": "导出到本地文件",
"_EXPORT_TO_GITHUB_GIST": "导出到Github Gist",
"_RECOVER_PLAYLIST": "从备份恢复",
"_RECOVER_WARNING": "选择备份文件,恢复我的歌单。注意:恢复我的歌单会覆盖现有的歌单。",
"_RECOVER_FROM_LOCAL_FILE": "从本地文件导入",
"_RECOVER_FROM_GITHUB_GIST": "从Github Gist导入",
"_CONNECT_TO_GITHUB": "连接到Github.com",
"_STATUS": "状态",
"_RECONNECT": "重新连接",
"_CANCEL_CONNECT": "取消连接",
"_SHORTCUTS": "快捷键",
"_VIEW_SHORTCUTS_LIST": "查看快捷键列表",
"_GLOBAL_SHORTCUTS_NOTICE": "启用全局快捷键",
"_LYRIC_DISPLAY": "歌词显示",
"_SHOW_DESKTOP_LYRIC": "启用桌面歌词",
"_SHOW_LYRIC_TRANSLATION": "外文歌词显示翻译(播放页)",
"_SHOW_DESKTOP_LYRIC_TRANSLATION": "外文歌词显示翻译(桌面歌词)",
"_CONNECT_TO_LASTFM": "连接到last.fm",
"_ABOUT": "关于",
"_HOMEPAGE": "主页",
"_EMAIL": "邮箱",
"_FEEDBACK": "反馈问题",
"_DESIGNER": "主题设计",
"_VERSION": "当前版本",
"_LATEST_VERSION": "最新版本",
"_LICENSE_NOTICE": "(本软件基于MIT协议开源免费)",
"_TOTAL_SONG_PREFIX": "共",
"_TOTAL_SONG_POSTFIX": "首",
"_CLEAR_ALL": "清空",
"_SEARCH_PLACEHOLDER": "搜索",
"_LANGUAGE": "语言",
"_ADD_TO_PLAYLIST_SUCCESS": "成功添加到我创建的歌单",
"_FAVORITE_PLAYLIST_SUCCESS": "收藏成功",
"_EDIT_PLAYLIST_SUCCESS": "编辑歌单成功",
"_IMPORTING_PLAYLIST": "正在导入歌单...",
"_IMPORTING_PLAYLIST_SUCCESS": "导入歌单成功",
"_REMOVE_PLAYLIST_SUCCESS": "删除歌单成功",
"_UNFAVORITE_PLAYLIST_SUCCESS": "取消收藏成功",
"_REMOVE_SONG_FROM_PLAYLIST_SUCCESS": "删除歌曲成功",
"_ADD_TO_QUEUE_SUCCESS": "添加到当前播放成功",
"_COPYRIGHT_ISSUE": "版权原因无法播放,请搜索其他平台",
"_INPUT_NEW_PLAYLIST_TITLE": "输入新歌单名称",
"_FAIL_OPEN_PLAYLIST_URL": "未能打开输入的歌单地址",
"_EXAMPLE": "例如",
"_CONFIRM": "确认",
"_THEME": "主题",
"_THEME_WHITE": "简约白",
"_THEME_BLACK": "深空灰",
"_THEME_MODERN_WHITE": "现代白",
"_THEME_MODERN_BLACK": "现代黑",
"_AUTO_CHOOSE_SOURCE": "自动切换源",
"_AUTO_CHOOSE_SOURCE_NOTICE": "是否自动切换播放源(仅在播放音乐失败后切换)",
"_AUTO_CHOOSE_SOURCE_LIST": "从以下平台搜索可用源",
"_NOWPLAYING_DISPLAY": "正在播放显示",
"_NOWPLAYING_COVER_BACKGROUND_NOTICE": "显示专辑封面作为背景",
"_NOWPLAYING_BITRATE_NOTICE": "显示比特率",
"_NOWPLAYING_PLATFORM_NOTICE": "显示音乐平台",
"_LOCAL_MUSIC": "本地音乐",
"_ADD_LOCAL_SONGS": "添加歌曲",
"netease": "网易",
"bilibili": "哔哩",
"kugou": "酷狗",
"kuwo": "酷我",
"migu": "咪咕",
"qq": "QQ",
"xiami": "虾米",
"taihe": "千千",
"localmusic": "本地",
"_CLOSE_TAB_ACTION": "关闭标签页时行为",
"_VALID_AFTER_RESTART": "需重启生效",
"_QUIT_APPLICATION": "退出应用",
"_MINIMIZE_TO_BACKGROUND": "最小化到后台",
"_MY_CREATED_PLAYLIST": "我创建的歌单",
"_MY_FAVORITE_PLAYLIST": "我收藏的歌单",
"_RECOMMEND_PLAYLIST": "推荐歌单",
"_LISTEN1_LOGIN_NOTICE": "Listen1不会传输你的账号数据到任何第三方服务器。",
"_PASSWORD": "密码",
"_LOGIN": "登录",
"_LOGOUT": "退出登录",
"_LOGIN_ERROR": "登录失败,请检查用户名和密码",
"_LOGIN_EMAIL_ERROR": "请输入正确的邮箱地址",
"_LOGIN_COUNTRYCODE_ERROR": "请输入正确的国家或地区代码",
"_LOGIN_PHONE_ERROR": "请输入正确的手机号",
"_LOGIN_PASSWORD_ERROR": "密码不能为空",
"_LOGIN_NETEASE": "登录网易云音乐",
"_LOGIN_BY_MOBILE_PHONE": "手机号登录",
"_LOGIN_BY_EMAIL": "邮箱登录",
"_MOBILE_PHONE": "手机号",
"_MY_NETEASE": "我的网易云音乐",
"_MY_QQ": "我的QQ音乐",
"_FAIL_ALL_NOTICE": "当前播放列表没有可播放的歌曲",
"_SHORTCUTS_FUNCTION": "功能说明",
"_GLOBAL_SHORTCUTS": "全局快捷键",
"_PLAY_OR_PAUSE": "播放/暂停",
"_PREVIOUS_TRACK": "上一首",
"_NEXT_TRACK": "下一首",
"_VOLUME_UP": "音量加",
"_VOLUME_DOWN": "音量减",
"_SHORTCUTS_NOT_SET": "空",
"_QUICK_SEARCH": "快速搜索",
"_SEARCH_PLAYLIST": "搜索歌单",
"_KEYBOARD_SPACE": "空格",
"_NOT_LOGIN_NICKNAME": "未登录",
"_LOGIN_DIALOG_NOTICE": "正在打开音乐平台的登录页,请在打开网页中完成登录流程,然后点击登录完成",
"_LOGIN_SUCCESS": "登录完成",
"_LOGIN_FAIL_RETRY": "登录遇到问题,再打开登录页面",
"_PROXY_SYSTEM": "使用系统代理",
"_PROXY_DIRECT": "不使用代理",
"_PROXY_CUSTOM": "自定义代理",
"_PROXY_CONFIG": "代理设置",
"_PROXY_NOT_SET": "未设置",
"_MODIFY": "修改",
"_PROTOCOL": "代理协议",
"_HOST": "主机地址",
"_PORT": "端口",
"ZOOM_IN_OUT": "放大/缩小"
}
================================================
FILE: i18n/zh-TC.json
================================================
{
"HELLO" : "你好",
"_ALL_MUSIC": "所有音樂",
"_NETEASE_MUSIC": "網易雲音樂",
"_QQ_MUSIC": "QQ音樂",
"_XIAMI_MUSIC": "蝦米音樂",
"_KUGOU_MUSIC": "酷狗音樂",
"_KUWO_MUSIC": "酷我音樂",
"_BILIBILI_MUSIC": "嗶哩嗶哩",
"_MIGU_MUSIC": "咪咕音樂",
"_TAIHE_MUSIC": "千千音樂",
"_PLATFORM_UNION": "平臺聚合",
"_PLAYLISTS": "精選歌單",
"_MY_MUSIC": "我的音樂",
"_CREATED_PLAYLIST": "創建的歌單",
"_FAVORITED_PLAYLIST": "收藏的歌單",
"_REFRESH_PLAYLIST": "刷新",
"_FAVORITED": "已收藏",
"_FAVORITE": "收藏",
"_PLAY_ALL": "播放全部",
"_ADD_TO_PLAYLIST": "添加到我的歌單",
"_EDIT": "編輯",
"_IMPORT": "導入",
"_IMPORT_PLAYLIST": "導入歌單",
"_ORIGIN_LINK": "連結",
"_SONGS": "曲目",
"_ARTISTS": "歌手",
"_ALBUMS": "專輯名",
"_OPERATION": "操作",
"_CREATE_PLAYLIST": "創建歌單",
"_CANCEL": "取消",
"_CREATE_AND_ADD_PLAYLIST": "創建並添加",
"_REMOVE_FROM_PLAYLIST": "從歌單裡移除",
"_ADD_TO_QUEUE": "加入到當前播放",
"_ARTIST": "歌手",
"_ALBUM": "專輯名",
"_PLAYLIST_TITLE": "歌單名稱",
"_PLAYLIST_AUTHOR": "歌單作者",
"_PLAYLIST_SONG_COUNT": "曲目數",
"_PLAYLIST_COVER_IMAGE_URL": "封面圖片url",
"_INPUT_PLAYLIST_TITLE": "鍵入歌單名稱",
"_INPUT_PLAYLIST_COVER_IMAGE_URL": "鍵入封面圖片URL",
"_EDIT_PLAYLIST": "編輯歌單",
"_REMOVE_PLAYLIST": "移除歌單",
"_OPENING_LASTFM_PAGE":"正在打開Last.fm頁面...",
"_CONFIRM_NOTICE_LASTFM": "請在打開的頁面點擊\"Yes, all access\", 允許Listen 1訪問你的帳戶。",
"_AUTHORIZED_FINISHED": "已經完成授權",
"_AUTHORIZED_REOPEN": "遇到問題,再次打開授權頁",
"_PLAYLIST_LINK": "歌單連結",
"_OPEN_PLAYLIST": "打開歌單",
"_OPENING_GITHUB_PAGE": "正在打開Github.com頁面...",
"_CONFIRM_NOTICE_GITHUB": "請在打開的頁面點擊\"Authencate\", 允許Listen 1訪問你的帳戶。",
"_CREATE_PLAYLIST_BACKUP": "創建歌單備份",
"_CREATE_PUBLIC_BACKUP": "創建公開備份",
"_CREATE_PRIVATE_BACKUP": "創建私有備份",
"_BACKUP_PLAYLIST": "備份歌單",
"_BACKUP_WARNING": "重建應用程式或清除緩存檔案會導致我的歌單數據丟失,強烈建議在做這件事,備份我的歌單。",
"_EXPORT_TO_LOCAL_FILE": "匯出到本地檔案",
"_EXPORT_TO_GITHUB_GIST": "匯出到Github Gist",
"_RECOVER_PLAYLIST": "從備份恢復",
"_RECOVER_WARNING": "選擇備份檔案,恢復我的歌單。危險:恢復我的歌單會覆蓋現有的歌單。",
"_RECOVER_FROM_LOCAL_FILE": "從本地檔案導入",
"_RECOVER_FROM_GITHUB_GIST": "從Github Gist導入",
"_CONNECT_TO_GITHUB": "連結到Github.com",
"_STATUS": "狀態",
"_RECONNECT": "重新連結",
"_CANCEL_CONNECT": "取消連結",
"_SHORTCUTS": "快速鍵",
"_VIEW_SHORTCUTS_LIST": "查看快速鍵列表",
"_GLOBAL_SHORTCUTS_NOTICE": "啟用全域快速鍵",
"_LYRIC_DISPLAY": "歌詞顯示",
"_SHOW_DESKTOP_LYRIC": "啟用桌面歌詞",
"_SHOW_LYRIC_TRANSLATION": "外文歌詞顯示翻譯(播放頁)",
"_SHOW_DESKTOP_LYRIC_TRANSLATION": "外文歌詞顯示翻譯(桌面歌詞)",
"_CONNECT_TO_LASTFM": "連結到last.fm",
"_ABOUT": "關於",
"_HOMEPAGE": "主頁",
"_EMAIL": "電郵",
"_FEEDBACK": "回饋問題",
"_DESIGNER": "主題設計",
"_VERSION": "當前版本",
"_LATEST_VERSION": "最新版本",
"_LICENSE_NOTICE": "(本軟體基於MIT協定開源免費)",
"_TOTAL_SONG_PREFIX": "總 ",
"_TOTAL_SONG_POSTFIX": " 首",
"_CLEAR_ALL": "清空",
"_SEARCH_PLACEHOLDER": "搜索",
"_LANGUAGE": "語言",
"_ADD_TO_PLAYLIST_SUCCESS": "成功添加到我創建的歌單",
"_FAVORITE_PLAYLIST_SUCCESS": "收藏成功",
"_EDIT_PLAYLIST_SUCCESS": "編輯歌單成功",
"_IMPORTING_PLAYLIST": "正在導入歌單...",
"_IMPORTING_PLAYLIST_SUCCESS": "導入歌單成功",
"_REMOVE_PLAYLIST_SUCCESS": "移除歌單成功",
"_UNFAVORITE_PLAYLIST_SUCCESS": "移除收藏成功",
"_REMOVE_SONG_FROM_PLAYLIST_SUCCESS": "移除曲目成功",
"_ADD_TO_QUEUE_SUCCESS": "添加到當前播放成功",
"_COPYRIGHT_ISSUE": "版權限定無法播放,請搜索其他平臺",
"_INPUT_NEW_PLAYLIST_TITLE": "鍵入新歌單名稱",
"_FAIL_OPEN_PLAYLIST_URL": "未能打開鍵入的歌單位址",
"_EXAMPLE": "例如 ",
"_CONFIRM": "確認",
"_THEME": "樣式",
"_THEME_WHITE": "簡約白",
"_THEME_BLACK": "深空灰",
"_THEME_MODERN_WHITE": "现代白",
"_THEME_MODERN_BLACK": "现代黑",
"_AUTO_CHOOSE_SOURCE": "自動切換源",
"_AUTO_CHOOSE_SOURCE_NOTICE": "是否自動切換播放源(僅在播放音樂失敗後切換)",
"_AUTO_CHOOSE_SOURCE_LIST": "從以下平臺搜索可用源",
"_NOWPLAYING_DISPLAY": "正在播放顯示",
"_NOWPLAYING_COVER_BACKGROUND_NOTICE": "顯示專輯封面作為背景",
"_NOWPLAYING_BITRATE_NOTICE": "顯示比特率",
"_NOWPLAYING_PLATFORM_NOTICE": "顯示音樂平臺",
"_LOCAL_MUSIC": "本機音樂",
"_ADD_LOCAL_SONGS": "添加本機音樂",
"netease": "網易",
"bilibili": "嗶哩嗶哩",
"kugou": "酷狗",
"kuwo": "酷我",
"migu": "咪咕",
"qq": "QQ",
"xiami": "蝦米",
"taihe": "千千",
"localmusic": "本地",
"_CLOSE_TAB_ACTION": "關閉標籤頁時行為",
"_VALID_AFTER_RESTART": "需重載生效",
"_QUIT_APPLICATION": "退出軟體",
"_MINIMIZE_TO_BACKGROUND": "最小化到後臺",
"_MY_CREATED_PLAYLIST": "我創建的歌單",
"_MY_FAVORITE_PLAYLIST": "我收藏的歌單",
"_RECOMMEND_PLAYLIST": "推薦歌單",
"_LISTEN1_LOGIN_NOTICE": "Listen1不會傳輸你的賬號數據到任何第三方伺服器。",
"_PASSWORD": "密碼",
"_LOGIN": "登錄",
"_LOGOUT": "退出登錄",
"_LOGIN_ERROR": "登錄失敗,請檢查用戶名和密碼",
"_LOGIN_EMAIL_ERROR": "請輸入正確的郵箱地址",
"_LOGIN_COUNTRYCODE_ERROR": "請輸入正確的國家或地區代碼",
"_LOGIN_PHONE_ERROR": "請輸入正確的手機號",
"_LOGIN_PASSWORD_ERROR": "密碼不能為空",
"_LOGIN_NETEASE": "登錄網易雲音樂",
"_LOGIN_BY_MOBILE_PHONE": "手機號登錄",
"_LOGIN_BY_EMAIL": "郵箱登錄",
"_MOBILE_PHONE": "手機號",
"_MY_NETEASE": "我的網易雲音樂",
"_MY_QQ": "我的QQ音樂",
"_FAIL_ALL_NOTICE": "當前播放列表沒有可播放的歌曲",
"_SHORTCUTS_FUNCTION": "功能說明",
"_GLOBAL_SHORTCUTS": "全局快捷鍵",
"_PLAY_OR_PAUSE": "播放/暫停",
"_PREVIOUS_TRACK": "上一首",
"_NEXT_TRACK": "下一首",
"_VOLUME_UP": "音量加",
"_VOLUME_DOWN": "音量減",
"_SHORTCUTS_NOT_SET": "空",
"_QUICK_SEARCH": "快速搜索",
"_SEARCH_PLAYLIST": "搜索歌單",
"_KEYBOARD_SPACE": "空格",
"_NOT_LOGIN_NICKNAME": "未登錄",
"_LOGIN_DIALOG_NOTICE": "正在打開音樂平臺的登錄頁,請在打開網頁中完成登錄流程,然後點擊登錄完成",
"_LOGIN_SUCCESS": "登錄完成",
"_LOGIN_FAIL_RETRY": "登錄遇到問題,再打開登錄頁面",
"_PROXY_SYSTEM": "使用系統代理",
"_PROXY_DIRECT": "不使用代理",
"_PROXY_CUSTOM": "自定義代理",
"_PROXY_CONFIG": "代理設置",
"_PROXY_NOT_SET": "未設置",
"_MODIFY": "修改",
"_PROTOCOL": "代理協議",
"_HOST": "主機地址",
"_PORT": "端口",
"ZOOM_IN_OUT": "放大/縮小"
}
================================================
FILE: js/app.js
================================================
/* eslint-disable no-shadow */
/* global l1Player require */
/* global angular isElectron i18next i18nextHttpBackend Notyf notyf */
/* global setPrototypeOfLocalStorage */
/* eslint-disable global-require */
/* eslint-disable no-unused-vars */
/* eslint-disable no-param-reassign */
/* eslint-disable import/no-unresolved */
const sourceList = [
{
name: 'netease',
displayId: '_NETEASE_MUSIC',
},
{
name: 'qq',
displayId: '_QQ_MUSIC',
},
{
name: 'kugou',
displayId: '_KUGOU_MUSIC',
},
{
name: 'kuwo',
displayId: '_KUWO_MUSIC',
},
{
name: 'bilibili',
displayId: '_BILIBILI_MUSIC',
},
{
name: 'migu',
displayId: '_MIGU_MUSIC',
},
{
name: 'taihe',
displayId: '_TAIHE_MUSIC',
},
];
const main = () => {
const app = angular.module('listenone', []);
setPrototypeOfLocalStorage();
app.config([
'$compileProvider',
($compileProvider) => {
$compileProvider.imgSrcSanitizationWhitelist(
/^\s*(https?|ftp|mailto|chrome-extension|moz-extension|file):/
);
},
]);
app.run([
'$q',
($q) => {
axios.Axios.prototype.request_original = axios.Axios.prototype.request;
axios.Axios.prototype.request = function new_req(config) {
return $q.when(this.request_original(config));
};
window.notyf = new Notyf({
duration: 5000,
ripple: true,
position: { x: 'center', y: 'top' },
types: [
{
type: 'warning',
background: 'darkorange',
icon: false,
},
{
type: 'info',
background: 'deepskyblue',
icon: false,
},
{
type: 'success',
className: 'notyf__toast--success',
backgroundColor: '#335eea',
icon: { className: 'notyf__icon--success', tagName: 'i' },
},
{
type: 'error',
className: 'notyf__toast--error',
backgroundColor: '#b90b2c',
icon: { className: 'notyf__icon--error', tagName: 'i' },
},
],
});
window.notyf.warning = (msg, replace) => {
if (replace) {
notyf.dismissAll();
}
window.notyf.open({
type: 'warning',
message: msg,
});
};
window.notyf.info = (msg, replace) => {
if (replace) {
notyf.dismissAll();
}
window.notyf.open({
type: 'info',
message: msg,
});
};
},
]);
l1Player.injectDirectives(app);
app.filter('playmode_title', () => (input) => {
switch (input) {
case 0:
return '顺序';
case 1:
return '随机';
case 2:
return '单曲循环';
default:
return '';
}
});
app.directive('customOnChange', () => {
const ret = {
restrict: 'A',
link: (scope, element, attrs) => {
const onChangeHandler = scope.$eval(attrs.customOnChange);
element.bind('change', onChangeHandler);
gitextract__a87_dzy/ ├── .eslintrc.json ├── .github/ │ └── workflows/ │ └── eslint.yml ├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── README_EN.md ├── css/ │ ├── common.css │ ├── common2.css │ ├── cover.css │ ├── hotkeys.css │ ├── icon.css │ ├── iparanoid.css │ ├── iparanoid2.css │ ├── notyf_custom.css │ ├── origin.css │ ├── origin2.css │ ├── player.css │ └── reset.css ├── i18n/ │ ├── en-US.json │ ├── fr-FR.json │ ├── ko-KR.json │ ├── pt-BR.json │ ├── zh-CN.json │ └── zh-TC.json ├── js/ │ ├── app.js │ ├── background.js │ ├── bridge.js │ ├── controller/ │ │ ├── auth.js │ │ ├── instant_search.js │ │ ├── my_playlist.js │ │ ├── navigation.js │ │ ├── platform.js │ │ ├── play.js │ │ ├── playlist.js │ │ └── profile.js │ ├── github.js │ ├── l1_player.js │ ├── lastfm.js │ ├── loweb.js │ ├── lowebutil.js │ ├── myplaylist.js │ ├── oauth_callback.js │ ├── player_thread.js │ └── provider/ │ ├── bilibili.js │ ├── kugou.js │ ├── kuwo.js │ ├── localmusic.js │ ├── migu.js │ ├── netease.js │ ├── qq.js │ ├── taihe.js │ └── xiami.js ├── listen1.html ├── manifest.json ├── manifest_firefox.json ├── package.json └── rules_1.json
SYMBOL INDEX (371 symbols across 21 files)
FILE: js/app.js
method link (line 185) | link(scope, element, attrs) {
method link (line 200) | link(scope, element, attrs) {
method link (line 216) | link(scope, element, attrs) {
method link (line 236) | link(scope, element, attrs) {
method link (line 256) | link(scope, elements, attrs) {
method link (line 299) | link(scope, element, attrs) {
function onMyMousedown (line 421) | function onMyMousedown() {
function onMyMouseup (line 427) | function onMyMouseup() {
function onMyUpdateProgress (line 433) | function onMyUpdateProgress(progress) {
function onMyCommitProgress (line 443) | function onMyCommitProgress(progress) {
function commitProgress (line 454) | function commitProgress(progress) {
function updateProgress (line 458) | function updateProgress() {
function mousemove (line 470) | function mousemove(event) {
function mouseup (line 475) | function mouseup() {
FILE: js/bridge.js
function getFrontPlayer (line 12) | function getFrontPlayer() {
function getBackgroundPlayer (line 16) | function getBackgroundPlayer() {
function getBackgroundPlayerAsync (line 20) | function getBackgroundPlayerAsync(callback) {
function getPlayer (line 26) | function getPlayer(mode) {
function getPlayerAsync (line 36) | function getPlayerAsync(mode, callback) {
function addFrontPlayerListener (line 47) | function addFrontPlayerListener(listener) {
function addBackgroundPlayerListener (line 51) | function addBackgroundPlayerListener(listener) {
function addPlayerListener (line 62) | function addPlayerListener(mode, listener) {
function frontPlayerSendMessage (line 72) | function frontPlayerSendMessage(message) {
function backgroundPlayerSendMessage (line 80) | function backgroundPlayerSendMessage(message) {
function playerSendMessage (line 84) | function playerSendMessage(mode, message) {
FILE: js/controller/instant_search.js
function updateCurrentPage (line 22) | function updateCurrentPage(cp) {
function updateTotalPage (line 36) | function updateTotalPage(totalItem) {
function performSearch (line 49) | function performSearch() {
function renderSearchPage (line 100) | function renderSearchPage() {
FILE: js/controller/navigation.js
function refreshWindow (line 89) | function refreshWindow(url, offset = 0) {
FILE: js/controller/play.js
function getCSSStringFromSetting (line 7) | function getCSSStringFromSetting(setting) {
function useModernTheme (line 27) | function useModernTheme() {
function getSafeIndex (line 32) | function getSafeIndex(index, length) {
function formatSecond (line 46) | function formatSecond(posSec) {
function switchMode (line 107) | function switchMode(mode) {
function parseLyric (line 386) | function parseLyric(lyric, tlyric) {
FILE: js/github.js
function github (line 3) | function github() {
FILE: js/l1_player.js
method play (line 17) | play() {
method pause (line 22) | pause() {
method togglePlayPause (line 27) | togglePlayPause() {
method playById (line 36) | playById(id) {
method loadById (line 41) | loadById(idx) {
method seek (line 46) | seek(per) {
method next (line 51) | next() {
method prev (line 56) | prev() {
method random (line 61) | random() {
method setLoopMode (line 66) | setLoopMode(input) {
method mute (line 72) | mute() {
method unmute (line 77) | unmute() {
method toggleMute (line 82) | toggleMute() {
method setVolume (line 88) | setVolume(per) {
method adjustVolume (line 94) | adjustVolume(increase) {
method addTrack (line 99) | addTrack(track) {
method insertTrack (line 104) | insertTrack(track, to_track, direction) {
method removeTrack (line 109) | removeTrack(index) {
method addTracks (line 114) | addTracks(list) {
method clearPlaylist (line 119) | clearPlaylist() {
method setNewPlaylist (line 124) | setNewPlaylist(list) {
method getTrackById (line 129) | getTrackById(id) {
method connectPlayer (line 133) | connectPlayer() {
method link (line 167) | link(scope, element) {
method link (line 176) | link(scope, element) {
method link (line 185) | link(scope, element) {
method link (line 194) | link(scope, element) {
method link (line 206) | link(scope, element, attrs) {
method link (line 215) | link(scope, element) {
FILE: js/lastfm.js
class lastfm (line 56) | class lastfm {
method getSession (line 57) | static getSession(callback) {
method getUserInfo (line 95) | static getUserInfo(callback) {
method updateStatus (line 123) | static updateStatus() {
method getAuth (line 141) | static getAuth(callback) {
method cancelAuth (line 163) | static cancelAuth() {
method sendNowPlaying (line 169) | static sendNowPlaying(track, artist, callback) {
method scrobble (line 195) | static scrobble(timestamp, track, artist, album, callback) {
method isAuthorized (line 226) | static isAuthorized() {
method isAuthRequested (line 230) | static isAuthRequested() {
method getStatusText (line 234) | static getStatusText() {
FILE: js/loweb.js
constant PROVIDERS (line 4) | const PROVIDERS = [
function getProviderByName (line 80) | function getProviderByName(sourceName) {
function getAllProviders (line 84) | function getAllProviders() {
function getAllSearchProviders (line 88) | function getAllSearchProviders() {
function getProviderNameByItemId (line 92) | function getProviderNameByItemId(itemId) {
function getProviderByItemId (line 97) | function getProviderByItemId(itemId) {
function queryStringify (line 108) | function queryStringify(options) {
method getLoginProviders (line 117) | getLoginProviders() {
method search (line 120) | search(source, options) {
method showMyPlaylist (line 156) | showMyPlaylist() {
method showPlaylistArray (line 160) | showPlaylistArray(source, offset, filter_id) {
method getPlaylistFilters (line 166) | getPlaylistFilters(source) {
method getLyric (line 171) | getLyric(track_id, album_id, lyric_url, tlyric_url) {
method showFavPlaylist (line 182) | showFavPlaylist() {
method queryPlaylist (line 186) | queryPlaylist(listId, type) {
method getPlaylist (line 193) | getPlaylist(listId, useCache = true) {
method clonePlaylist (line 217) | clonePlaylist(id, type) {
method removeMyPlaylist (line 230) | removeMyPlaylist(id, type) {
method addMyPlaylist (line 237) | addMyPlaylist(id, track) {
method insertTrackToMyPlaylist (line 243) | insertTrackToMyPlaylist(id, track, to_track, direction) {
method addPlaylist (line 254) | addPlaylist(id, tracks) {
method removeTrackFromMyPlaylist (line 259) | removeTrackFromMyPlaylist(id, track) {
method removeTrackFromPlaylist (line 266) | removeTrackFromPlaylist(id, track) {
method createMyPlaylist (line 271) | createMyPlaylist(title, track) {
method insertMyplaylistToMyplaylists (line 279) | insertMyplaylistToMyplaylists(
method editMyPlaylist (line 295) | editMyPlaylist(id, title, coverImgUrl) {
method parseURL (line 302) | parseURL(url) {
method mergePlaylist (line 325) | mergePlaylist(source, target) {
method bootstrapTrack (line 338) | bootstrapTrack(track, playerSuccessCallback, playerFailCallback) {
method login (line 405) | login(source, options) {
method getUser (line 411) | getUser(source) {
method getLoginUrl (line 415) | getLoginUrl(source) {
method getUserCreatedPlaylist (line 419) | getUserCreatedPlaylist(source, options) {
method getUserFavoritePlaylist (line 425) | getUserFavoritePlaylist(source, options) {
method getRecommendPlaylist (line 431) | getRecommendPlaylist(source) {
method logout (line 436) | logout(source) {
FILE: js/lowebutil.js
function getParameterByName (line 5) | function getParameterByName(name, url) {
function isElectron (line 16) | function isElectron() {
function cookieGet (line 20) | function cookieGet(cookieRequest, callback) {
function cookieSet (line 38) | function cookieSet(cookie, callback) {
function cookieRemove (line 49) | function cookieRemove(cookie, callback) {
function setPrototypeOfLocalStorage (line 63) | function setPrototypeOfLocalStorage() {
function getLocalStorageValue (line 79) | function getLocalStorageValue(key, defaultValue) {
function easeInOutQuad (line 88) | function easeInOutQuad(t, b, c, d) {
function smoothScrollTo (line 99) | function smoothScrollTo(element, to, duration) {
FILE: js/myplaylist.js
function array_move (line 4) | function array_move(arr, old_index, new_index) {
function getPlaylistObjectKey (line 16) | function getPlaylistObjectKey(playlist_type) {
function show_myplaylist (line 25) | function show_myplaylist(playlist_type) {
function get_myplaylist (line 52) | function get_myplaylist(url) {
function guid (line 69) | function guid() {
function insert_myplaylist_to_myplaylists (line 78) | function insert_myplaylist_to_myplaylists(
function add_track_to_myplaylist (line 148) | function add_track_to_myplaylist(playlist_id, track) {
function insert_track_to_myplaylist (line 176) | function insert_track_to_myplaylist(playlist_id, track, to_track, direct...
function remove_track_from_myplaylist (line 195) | function remove_track_from_myplaylist(playlist_id, track_id) {
function create_myplaylist (line 205) | function create_myplaylist(playlist_title, track) {
function edit_myplaylist (line 228) | function edit_myplaylist(playlist_id, title, cover_img_url) {
function myplaylist_containers (line 238) | function myplaylist_containers(playlist_type, list_id) {
FILE: js/player_thread.js
class Player (line 10) | class Player {
method constructor (line 11) | constructor() {
method setMode (line 22) | setMode(newMode) {
method setRefreshRate (line 26) | setRefreshRate(rate = 10) {
method currentAudio (line 35) | get currentAudio() {
method currentHowl (line 39) | get currentHowl() {
method playing (line 43) | get playing() {
method muted (line 48) | get muted() {
method insertAudio (line 52) | insertAudio(audio, idx) {
method array_move (line 69) | static array_move(arr, old_index, new_index) {
method insertAudioByDirection (line 82) | insertAudioByDirection(audio, to_audio, direction) {
method removeAudio (line 109) | removeAudio(idx) {
method appendAudioList (line 141) | appendAudioList(list) {
method clearPlaylist (line 150) | clearPlaylist() {
method stopAll (line 158) | stopAll() {
method setNewPlaylist (line 166) | setNewPlaylist(list) {
method playById (line 183) | playById(id) {
method loadById (line 188) | loadById(id) {
method play (line 198) | play(idx) {
method retrieveMediaUrl (line 209) | retrieveMediaUrl(index, playNow) {
method load (line 251) | load(idx) {
method finishLoad (line 266) | finishLoad(index, playNow) {
method pause (line 370) | pause() {
method skip (line 381) | skip(direction) {
method loop_mode (line 438) | set loop_mode(input) {
method loop_mode (line 456) | get loop_mode() {
method volume (line 464) | set volume(val) {
method volume (line 474) | get volume() {
method adjustVolume (line 478) | adjustVolume(inc) {
method mute (line 486) | mute() {
method unmute (line 494) | unmute() {
method seek (line 506) | seek(per) {
method seekTime (line 522) | seekTime(seconds) {
method formatTime (line 533) | static formatTime(secs) {
method setMediaURI (line 540) | setMediaURI(uri, url) {
method setAudioDisabled (line 546) | setAudioDisabled(disabled, idx) {
method sendFrameUpdate (line 552) | async sendFrameUpdate() {
method sendPlayingEvent (line 574) | async sendPlayingEvent(reason = 'UNKNOWN') {
method sendLoadEvent (line 584) | async sendLoadEvent() {
method sendVolumeEvent (line 600) | async sendVolumeEvent() {
method sendPlaylistEvent (line 607) | async sendPlaylistEvent() {
FILE: js/provider/bilibili.js
class bilibili (line 6) | class bilibili {
method htmlDecode (line 7) | static htmlDecode(value) {
method fetch_wbi_key (line 12) | static fetch_wbi_key() {
method clear_wbi_key (line 34) | static clear_wbi_key() {
method get_wbi_key (line 38) | static get_wbi_key() {
method enc_wbi (line 48) | static enc_wbi(params) {
method wrap_wbi_request (line 92) | static wrap_wbi_request(url, params) {
method bi_convert_song (line 112) | static bi_convert_song(song_info) {
method bi_convert_song2 (line 127) | static bi_convert_song2(song_info) {
method show_playlist (line 144) | static show_playlist(url) {
method bi_get_playlist (line 169) | static bi_get_playlist(url) {
method bi_album (line 198) | static bi_album(url) {
method bi_track (line 220) | static bi_track(url) {
method bi_convert_song3 (line 246) | static bi_convert_song3(song_info, bvid, author, default_img) {
method bi_artist (line 265) | static bi_artist(url) {
method parse_url (line 319) | static parse_url(url) {
method bootstrap_track (line 336) | static bootstrap_track(track, success, failure) {
method search (line 381) | static search(url) {
method lyric (line 423) | static lyric() {
method get_playlist (line 433) | static get_playlist(url) {
method get_playlist_filters (line 449) | static get_playlist_filters() {
method get_user (line 455) | static get_user() {
method get_login_url (line 461) | static get_login_url() {
method logout (line 465) | static logout() {}
FILE: js/provider/kugou.js
class kugou (line 3) | class kugou {
method kg_convert_song (line 4) | static kg_convert_song(song) {
method async_process_list (line 29) | static async_process_list(
method kg_render_search_result_item (line 48) | static kg_render_search_result_item(index, item, params, callback) {
method search (line 61) | static search(url) {
method kg_render_playlist_result_item (line 135) | static kg_render_playlist_result_item(index, item, params, callback) {
method kg_get_playlist (line 180) | static kg_get_playlist(url) {
method kg_render_artist_result_item (line 217) | static kg_render_artist_result_item(index, item, params, callback) {
method kg_artist (line 257) | static kg_artist(url) {
method getTimestampString (line 291) | static getTimestampString() {
method getRandomIntString (line 295) | static getRandomIntString() {
method getRandomHexString (line 299) | static getRandomHexString() {
method bootstrap_track (line 308) | static bootstrap_track(track, success, failure) {
method lyric (line 330) | static lyric(url) {
method kg_render_album_result_item (line 350) | static kg_render_album_result_item(index, item, params, callback) {
method kg_album (line 380) | static kg_album(url) {
method show_playlist (line 419) | static show_playlist(url) {
method parse_url (line 451) | static parse_url(url) {
method get_playlist (line 470) | static get_playlist(url) {
method get_playlist_filters (line 485) | static get_playlist_filters() {
method get_user (line 491) | static get_user() {
method get_login_url (line 497) | static get_login_url() {
method logout (line 501) | static logout() {}
FILE: js/provider/kuwo.js
function h (line 5) | function h(t, e) {
class kuwo (line 49) | class kuwo {
method forgeMD5 (line 50) | static forgeMD5(message) {
method html_decode (line 63) | static html_decode(str) {
method fix_json (line 89) | static fix_json(data) {
method num2str (line 93) | static num2str(num) {
method kw_convert_song2 (line 117) | static kw_convert_song2(item) {
method kw_convert_song3 (line 132) | static kw_convert_song3(item) {
method kw_get_token (line 232) | static kw_get_token(callback, isRetry) {
method kw_cookie_get (line 261) | static kw_cookie_get(url, callback) {
method kw_render_tracks (line 294) | static kw_render_tracks(url, page, callback) {
method search (line 319) | static search(url) {
method bootstrap_track (line 381) | static bootstrap_track(track, success, failure) {
method kw_get_lrc (line 400) | static kw_get_lrc(arr) {
method kw_generate_translation (line 413) | static kw_generate_translation(lrclist) {
method lyric (line 462) | static lyric(url) {
method kw_artist (line 484) | static kw_artist(url) {
method kw_album (line 530) | static kw_album(url) {
method show_playlist (line 575) | static show_playlist(url) {
method kw_get_playlist (line 660) | static kw_get_playlist(url) {
method parse_url (line 704) | static parse_url(myurl) {
method get_playlist (line 744) | static get_playlist(url) {
method get_playlist_filters (line 758) | static get_playlist_filters() {
method get_user (line 764) | static get_user() {
method get_login_url (line 772) | static get_login_url() {
method logout (line 776) | static logout() {}
FILE: js/provider/localmusic.js
class localmusic (line 14) | class localmusic {
method show_playlist (line 15) | static show_playlist(url, hm) {
method lm_get_playlist (line 24) | static lm_get_playlist(url) {
method lm_album (line 38) | static lm_album(url) {
method lm_artist (line 57) | static lm_artist(url) {
method bootstrap_track (line 78) | static bootstrap_track(track, success, failure) {
method lyric (line 86) | static lyric(url) {
method add_playlist (line 103) | static add_playlist(list_id, tracks) {
method parse_url (line 125) | static parse_url(url) {
method get_playlist (line 134) | static get_playlist(url) {
method remove_from_playlist (line 148) | static remove_from_playlist(list_id, track_id) {
method get_playlist_filters (line 163) | static get_playlist_filters() {
FILE: js/provider/migu.js
class migu (line 5) | class migu {
method mg_convert_song (line 6) | static mg_convert_song(song) {
method mg_convert_song2 (line 29) | static mg_convert_song2(song) {
method mg_render_tracks (line 52) | static mg_render_tracks(url, page, callback) {
method mg_show_toplist (line 76) | static mg_show_toplist(offset) {
method show_playlist (line 134) | static show_playlist(url) {
method mg_toplist (line 175) | static mg_toplist(url) {
method mg_get_playlist (line 346) | static mg_get_playlist(url) {
method mg_album (line 376) | static mg_album(url) {
method mg_artist (line 407) | static mg_artist(url) {
method bootstrap_track (line 437) | static bootstrap_track(track, success, failure) {
method search (line 546) | static search(url) {
method uuid (line 671) | static uuid() {
method lyric (line 678) | static lyric(url) {
method mg_generate_translation (line 731) | static mg_generate_translation(plain, translation) {
method parse_url (line 771) | static parse_url(url) {
method get_playlist (line 793) | static get_playlist(url) {
method get_playlist_filters (line 809) | static get_playlist_filters() {
method get_user (line 844) | static get_user() {
method get_login_url (line 876) | static get_login_url() {
method logout (line 880) | static logout() {
FILE: js/provider/netease.js
class netease (line 5) | class netease {
method _create_secret_key (line 6) | static _create_secret_key(size) {
method _aes_encrypt (line 16) | static _aes_encrypt(text, sec_key, algo) {
method _rsa_encrypt (line 25) | static _rsa_encrypt(text, pubKey, modulus) {
method weapi (line 34) | static weapi(text) {
method eapi (line 61) | static eapi(url, object) {
method ne_show_toplist (line 78) | static ne_show_toplist(offset) {
method show_playlist (line 105) | static show_playlist(url) {
method ne_ensure_cookie (line 161) | static ne_ensure_cookie(callback) {
method async_process_list (line 218) | static async_process_list(
method ng_render_playlist_result_item (line 237) | static ng_render_playlist_result_item(index, item, callback) {
method ng_parse_playlist_tracks (line 265) | static ng_parse_playlist_tracks(playlist_tracks, callback) {
method split_array (line 291) | static split_array(myarray, size) {
method ne_get_playlist (line 300) | static ne_get_playlist(url) {
method bootstrap_track (line 355) | static bootstrap_track(track, success, failure) {
method is_playable (line 397) | static is_playable(song) {
method search (line 401) | static search(url) {
method ne_album (line 473) | static ne_album(url) {
method ne_artist (line 510) | static ne_artist(url) {
method lyric (line 548) | static lyric(url) {
method parse_url (line 583) | static parse_url(url) {
method get_playlist (line 621) | static get_playlist(url) {
method get_playlist_filters (line 635) | static get_playlist_filters() {
method login (line 750) | static login(url) {
method get_user_playlist (line 829) | static get_user_playlist(url, playlistType) {
method get_user_created_playlist (line 872) | static get_user_created_playlist(url) {
method get_user_favorite_playlist (line 876) | static get_user_favorite_playlist(url) {
method get_recommend_playlist (line 880) | static get_recommend_playlist() {
method get_user (line 917) | static get_user() {
method get_login_url (line 949) | static get_login_url() {
method logout (line 953) | static logout() {
FILE: js/provider/qq.js
class qq (line 4) | class qq {
method htmlDecode (line 5) | static htmlDecode(value) {
method qq_show_toplist (line 10) | static qq_show_toplist(offset) {
method show_playlist (line 38) | static show_playlist(url) {
method qq_get_image_url (line 75) | static qq_get_image_url(qqimgid, img_type) {
method qq_is_playable (line 91) | static qq_is_playable(song) {
method qq_convert_song (line 103) | static qq_convert_song(song) {
method qq_convert_song2 (line 120) | static qq_convert_song2(song) {
method get_toplist_url (line 136) | static get_toplist_url(id, period, limit) {
method get_periods (line 156) | static get_periods(topid) {
method qq_toplist (line 183) | static qq_toplist(url) {
method qq_get_playlist (line 228) | static qq_get_playlist(url) {
method qq_album (line 262) | static qq_album(url) {
method qq_artist (line 294) | static qq_artist(url) {
method search (line 340) | static search(url) {
method UnicodeToAscii (line 409) | static UnicodeToAscii(str) {
method bootstrap_track (line 418) | static bootstrap_track(track, success, failure) {
method str2ab (line 504) | static str2ab(str) {
method lyric (line 514) | static lyric(url) {
method parse_url (line 536) | static parse_url(url) {
method get_playlist (line 592) | static get_playlist(url) {
method get_playlist_filters (line 608) | static get_playlist_filters() {
method get_user_by_uin (line 648) | static get_user_by_uin(uin, callback) {
method get_user_created_playlist (line 681) | static get_user_created_playlist(url) {
method get_user_favorite_playlist (line 729) | static get_user_favorite_playlist(url) {
method get_recommend_playlist (line 771) | static get_recommend_playlist() {
method get_user (line 812) | static get_user() {
method get_login_url (line 846) | static get_login_url() {
method logout (line 850) | static logout() {
FILE: js/provider/taihe.js
class taihe (line 28) | class taihe {
method th_convert_song (line 29) | static th_convert_song(song) {
method th_render_tracks (line 47) | static th_render_tracks(url, page, callback) {
method search (line 64) | static search(url) {
method th_get_playlist (line 108) | static th_get_playlist(url) {
method th_artist (line 147) | static th_artist(url) {
method bootstrap_track (line 184) | static bootstrap_track(track, success, failure) {
method lyric (line 207) | static lyric(url) {
method th_album (line 239) | static th_album(url) {
method show_playlist (line 282) | static show_playlist(url) {
method parse_url (line 312) | static parse_url(url) {
method get_playlist (line 345) | static get_playlist(url) {
method get_playlist_filters (line 359) | static get_playlist_filters() {
method get_user (line 378) | static get_user() {
method get_login_url (line 386) | static get_login_url() {
method logout (line 390) | static logout() {}
FILE: js/provider/xiami.js
class xiami (line 6) | class xiami {
method show_playlist (line 7) | static show_playlist() {
method bootstrap_track (line 17) | static bootstrap_track(track, success, failure) {
method xm_get_playlist (line 22) | static xm_get_playlist(url) {
method xm_search (line 38) | static xm_search(url) {
method xm_album (line 51) | static xm_album(url) {
method xm_artist (line 69) | static xm_artist(url) {
method lyric (line 87) | static lyric() {
method parse_url (line 97) | static parse_url() {
method get_playlist (line 106) | static get_playlist(url) {
method get_playlist_filters (line 120) | static get_playlist_filters() {
method get_user (line 126) | static get_user() {
method get_login_url (line 134) | static get_login_url() {
method logout (line 138) | static logout() {}
Condensed preview — 58 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (839K chars).
[
{
"path": ".eslintrc.json",
"chars": 473,
"preview": "{\n \"parserOptions\": {\n \"ecmaVersion\": 11\n },\n \"extends\": [\n \"airbnb-base\",\n \"prettier\"\n "
},
{
"path": ".github/workflows/eslint.yml",
"chars": 362,
"preview": "name: ESLint\n\non:\n push:\n branches: [master]\n pull_request:\n branches: [master]\n\njobs:\n build:\n runs-on: ubu"
},
{
"path": ".gitignore",
"chars": 93,
"preview": "# Folder view configuration files\n.DS_Store\n.vscode\n.eslintcache\n\nnode_modules\ndist\n_metadata"
},
{
"path": ".prettierrc",
"chars": 55,
"preview": "{\n \"singleQuote\": true,\n \"trailingComma\": \"es5\"\n}"
},
{
"path": "LICENSE",
"chars": 1074,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2016 Listen 1\n\nPermission is hereby granted, free of charge, to any person obtainin"
},
{
"path": "README.md",
"chars": 10810,
"preview": "# Listen 1 (Chrome Extension) V2.33.0\n\n(最后更新于 2025 年 6 月 17 日)\n\n[ V2.33.0\n\n(Last Update June 17th, 2025)\n\n[;\n color: var(--text-default-color);\n fon"
},
{
"path": "css/common2.css",
"chars": 56363,
"preview": "html,\nbody {\n margin: 0;\n padding: 0;\n font-size: var(--text-default-size);\n color: var(--text-default-color);\n fon"
},
{
"path": "css/cover.css",
"chars": 3337,
"preview": "/*\n * Globals\n */\n\n/* Links */\na,\na:focus,\na:hover {\n color: #fff;\n}\n\n/* Custom default button */\n.btn-default,\n.btn-de"
},
{
"path": "css/hotkeys.css",
"chars": 1855,
"preview": "/*! \n * angular-hotkeys v1.7.0\n * https://chieffancypants.github.io/angular-hotkeys\n * Copyright (c) 2016 Wes Cruver\n * "
},
{
"path": "css/icon.css",
"chars": 1713,
"preview": "@font-face {\n font-family: 'listen1-icon';\n src: url('../fonts/listen1-icon.eot?4ftssm');\n src: url('../fonts/listen1"
},
{
"path": "css/iparanoid.css",
"chars": 2476,
"preview": "/* global settings (theme related) */\n:root {\n --icon-default-color: #666666;\n --icon-highlight-color: #111111;\n\n --t"
},
{
"path": "css/iparanoid2.css",
"chars": 2113,
"preview": "/* global settings (theme related) */\n:root {\n --icon-default-color: #000;\n\n --text-default-color: #000;\n --text-subt"
},
{
"path": "css/notyf_custom.css",
"chars": 80,
"preview": ".notyf__toast {\n border-radius: 10px;\n}\n\n.notyf__dismiss-btn {\n outline: 0;\n}\n"
},
{
"path": "css/origin.css",
"chars": 2518,
"preview": "/* global settings (theme related) */\n:root {\n --icon-default-color: #666666;\n --icon-highlight-color: #111111;\n\n --t"
},
{
"path": "css/origin2.css",
"chars": 2033,
"preview": "/* global settings (theme related) */\n:root {\n --icon-default-color: #666666;\n\n --text-default-color: #ffffff;\n --tex"
},
{
"path": "css/player.css",
"chars": 19204,
"preview": "a {\n cursor: pointer;\n}\n\n.shadow {\n position: fixed;\n background: rgba(30, 30, 30, 0.5);\n _position: absolute;\n z-i"
},
{
"path": "css/reset.css",
"chars": 930,
"preview": "html,\nbody,\nspan,\napplet,\nobject,\niframe,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nblockquote,\npre,\na,\nabbr,\nacronym,\naddress,\nbig,\nci"
},
{
"path": "i18n/en-US.json",
"chars": 7118,
"preview": "{\n \"HELLO\" : \"hi\",\n \"_ALL_MUSIC\": \"All Music\",\n \"_NETEASE_MUSIC\": \"Netease\",\n \"_QQ_MUSIC\": \"QQ\",\n \"_XIAMI_MUSIC\":"
},
{
"path": "i18n/fr-FR.json",
"chars": 7537,
"preview": "{\n \"HELLO\" : \"Bonjour\",\n \"_ALL_MUSIC\": \"All Music\",\n \"_NETEASE_MUSIC\": \"Netease\",\n \"_QQ_MUSIC\": \"QQ\",\n \"_XIAMI_MU"
},
{
"path": "i18n/ko-KR.json",
"chars": 6039,
"preview": "{\n \"HELLO\": \"안녕하세요\",\n \"_ALL_MUSIC\": \"모든 음악\",\n \"_NETEASE_MUSIC\": \"Netease\",\n \"_QQ_MUSIC\": \"QQ\",\n \"_XIAMI_MUSIC\": \"Xi"
},
{
"path": "i18n/pt-BR.json",
"chars": 7666,
"preview": "{\n \"HELLO\" : \"Olá\",\n \"_ALL_MUSIC\": \"Todas as músicas\",\n \"_NETEASE_MUSIC\": \"Netease\",\n \"_QQ_MUSIC\": \"QQ\",\n \"_XIAMI"
},
{
"path": "i18n/zh-CN.json",
"chars": 5288,
"preview": "{\n \"HELLO\" : \"你好\",\n \"_ALL_MUSIC\": \"所有音乐\",\n \"_NETEASE_MUSIC\": \"网易云音乐\",\n \"_QQ_MUSIC\": \"QQ音乐\",\n \"_XIAMI_MUSIC\": \"虾米音"
},
{
"path": "i18n/zh-TC.json",
"chars": 5473,
"preview": "{\r\n \"HELLO\" : \"你好\",\r\n \"_ALL_MUSIC\": \"所有音樂\",\r\n \"_NETEASE_MUSIC\": \"網易雲音樂\",\r\n \"_QQ_MUSIC\": \"QQ音樂\",\r\n \"_XIAMI_MUSIC\""
},
{
"path": "js/app.js",
"chars": 14677,
"preview": "/* eslint-disable no-shadow */\n/* global l1Player require */\n/* global angular isElectron i18next i18nextHttpBackend Not"
},
{
"path": "js/background.js",
"chars": 5507,
"preview": "/* eslint-disable no-unused-vars */\n/* global GithubClient */\nchrome.action.onClicked.addListener((tab) => {\n chrome.ta"
},
{
"path": "js/bridge.js",
"chars": 2053,
"preview": "/* eslint-disable no-unused-vars */\n/*\nbuild a bridge between UI and audio player\n\naudio player has 2 modes, but share s"
},
{
"path": "js/controller/auth.js",
"chars": 1407,
"preview": "/* eslint-disable import/no-unresolved */\n/* eslint-disable global-require */\n/* global angular MediaService isElectron "
},
{
"path": "js/controller/instant_search.js",
"chars": 4011,
"preview": "/* eslint-disable no-param-reassign */\n/* global angular i18next MediaService sourceList */\nangular.module('listenone')."
},
{
"path": "js/controller/my_playlist.js",
"chars": 1098,
"preview": "/* eslint-disable no-unused-vars */\n/* global angular MediaService */\n\nangular.module('listenone').controller('MyPlayLis"
},
{
"path": "js/controller/navigation.js",
"chars": 21982,
"preview": "/* eslint-disable import/no-unresolved */\n/* eslint-disable global-require */\n/* eslint-disable no-shadow */\n/* eslint-d"
},
{
"path": "js/controller/platform.js",
"chars": 1638,
"preview": "/* global angular MediaService */\nconst platformSourceList = [\n {\n name: 'my_created_playlist',\n displayId: '_MY_"
},
{
"path": "js/controller/play.js",
"chars": 28981,
"preview": "/* eslint-disable no-param-reassign */\n/* eslint-disable no-shadow */\n/* eslint-disable import/no-unresolved */\n/* eslin"
},
{
"path": "js/controller/playlist.js",
"chars": 1949,
"preview": "/* eslint-disable no-unused-vars */\n/* global angular MediaService sourceList */\n\nangular.module('listenone').controller"
},
{
"path": "js/controller/profile.js",
"chars": 5348,
"preview": "/* eslint-disable import/no-unresolved */\n/* eslint-disable global-require */\n/* eslint-disable no-undef */\n/* eslint-di"
},
{
"path": "js/github.js",
"chars": 5725,
"preview": "/* global isElectron require */\n/* eslint-disable global-require */\nfunction github() {\n const OAUTH_URL = 'https://git"
},
{
"path": "js/l1_player.js",
"chars": 5821,
"preview": "/* eslint-disable no-param-reassign */\n/* global isElectron getPlayer getPlayerAsync addPlayerListener getLocalStorageVa"
},
{
"path": "js/lastfm.js",
"chars": 5833,
"preview": "/* global forge */\n// eslint-disable-next-line no-unused-vars\n{\n const options = {\n apiKey: '6790c00a181128dc7c4ce06"
},
{
"path": "js/loweb.js",
"chars": 11655,
"preview": "/* global async LRUCache setPrototypeOfLocalStorage getLocalStorageValue */\n/* global netease xiami qq kugou kuwo bilibi"
},
{
"path": "js/lowebutil.js",
"chars": 3168,
"preview": "/* eslint-disable consistent-return */\n/* eslint-disable no-param-reassign */\n/* eslint-disable no-unused-vars */\n\nfunct"
},
{
"path": "js/myplaylist.js",
"chars": 7442,
"preview": "/* eslint-disable no-unused-vars */\n/* global getParameterByName */\nconst myplaylistFactory = () => {\n function array_m"
},
{
"path": "js/oauth_callback.js",
"chars": 309,
"preview": "/**\n * Get and send oauth tokens from query string.\n */\n\nchrome.runtime.sendMessage(\n {\n type: 'code',\n code: new"
},
{
"path": "js/player_thread.js",
"chars": 18222,
"preview": "/* eslint-disable no-underscore-dangle */\n/* global MediaMetadata playerSendMessage MediaService */\n/* global Howl Howle"
},
{
"path": "js/provider/bilibili.js",
"chars": 14137,
"preview": "let wbi_key = null;\n/* global getParameterByName */\n// eslint-disable-next-line no-unused-vars\n/* global cookieSet cooki"
},
{
"path": "js/provider/kugou.js",
"chars": 15082,
"preview": "/* eslint-disable no-unused-vars */\n/* global async getParameterByName */\nclass kugou {\n static kg_convert_song(song) {"
},
{
"path": "js/provider/kuwo.js",
"chars": 23453,
"preview": "/* eslint-disable no-undef */\n/* eslint-disable no-unused-vars */\n/* global async getParameterByName isElectron */\n\nfunc"
},
{
"path": "js/provider/localmusic.js",
"chars": 4545,
"preview": "/* eslint-disable no-param-reassign */\n/* eslint-disable no-unused-vars */\n/* global getParameterByName */\nconst default"
},
{
"path": "js/provider/migu.js",
"chars": 31148,
"preview": "/* eslint-disable consistent-return */\n/* eslint-disable no-unused-vars */\n/* eslint-disable no-use-before-define */\n/* "
},
{
"path": "js/provider/netease.js",
"chars": 29368,
"preview": "/* eslint-disable no-underscore-dangle */\n/* eslint-disable no-unused-vars */\n/* global getParameterByName forge */\n/* g"
},
{
"path": "js/provider/qq.js",
"chars": 25974,
"preview": "/* eslint-disable no-use-before-define */\n/* global getParameterByName cookieGet cookieRemove */\n// eslint-disable-next-"
},
{
"path": "js/provider/taihe.js",
"chars": 10245,
"preview": "/* eslint-disable no-unused-vars */\n/* global async getParameterByName forge */\nconst axiosTH = axios.create({\n baseURL"
},
{
"path": "js/provider/xiami.js",
"chars": 3186,
"preview": "/* eslint-disable radix */\n/* eslint-disable no-use-before-define */\n/* global getParameterByName */\n/* eslint-disable n"
},
{
"path": "listen1.html",
"chars": 299187,
"preview": "<!DOCTYPE html>\n<html lang=\"en\" ng-app=\"listenone\">\n <head>\n <meta charset=\"utf-8\" />\n <meta http-equiv=\"X-UA-Com"
},
{
"path": "manifest.json",
"chars": 1342,
"preview": "{\n \"background\": {\n \"service_worker\": \"js/background.js\"\n },\n \"action\": {\n \"default_icon\": \"images/logo.png\",\n "
},
{
"path": "manifest_firefox.json",
"chars": 1435,
"preview": "{\n \"applications\": {\n \"gecko\": {\n \"id\": \"githublisten1@gmail.com\",\n \"strict_min_version\": \"45.0\"\n }\n }"
},
{
"path": "package.json",
"chars": 989,
"preview": "{\n \"name\": \"listen1_chrome_extension\",\n \"version\": \"2.33.0\",\n \"description\": \"one for all free music in china\",\n \"ma"
},
{
"path": "rules_1.json",
"chars": 1319,
"preview": "[\n {\n \"id\": 1,\n \"priority\": 1,\n \"action\": {\n \"type\": \"modifyHeaders\",\n \"requestHeaders\": [\n {"
}
]
About this extraction
This page contains the full source code of the listen1/listen1_chrome_extension GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 58 files (783.2 KB), approximately 215.3k tokens, and a symbol index with 371 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.