├── .gitignore
├── LICENSE
├── README.md
├── _config.yml
├── anime-music.js
├── animeMusic_server
├── aliyun
│ ├── __init__.py
│ └── oss.py
├── anime_music
│ ├── README.md
│ ├── apps
│ │ ├── __init__.py
│ │ ├── app
│ │ │ ├── __init__.py
│ │ │ ├── app.py
│ │ │ ├── appv2.py
│ │ │ ├── base.py
│ │ │ ├── god.py
│ │ │ └── setting.py
│ │ └── settings.py
│ ├── daemon.sh
│ ├── main.py
│ ├── nginx
│ │ └── anime-music.jijidown.com.conf
│ ├── restart.sh
│ ├── script
│ │ ├── __init__.py
│ │ ├── mongoIndex.py
│ │ ├── realpath.py
│ │ └── savetoImage.py
│ ├── setting.py
│ ├── static
│ │ ├── css
│ │ │ ├── layui.css
│ │ │ ├── layui.min.css
│ │ │ ├── layui.mobile.css
│ │ │ ├── layui.mobile.min.css
│ │ │ └── modules
│ │ │ │ ├── code.css
│ │ │ │ ├── laydate
│ │ │ │ └── default
│ │ │ │ │ └── laydate.css
│ │ │ │ └── layer
│ │ │ │ └── default
│ │ │ │ ├── icon-ext.png
│ │ │ │ ├── icon.png
│ │ │ │ ├── layer.css
│ │ │ │ ├── loading-0.gif
│ │ │ │ ├── loading-1.gif
│ │ │ │ └── loading-2.gif
│ │ ├── favicon.ico
│ │ ├── god
│ │ │ ├── anime.html
│ │ │ └── music.html
│ │ ├── img
│ │ │ └── logo.png
│ │ ├── lay
│ │ │ └── modules
│ │ │ │ ├── carousel.js
│ │ │ │ ├── code.js
│ │ │ │ ├── element.js
│ │ │ │ ├── flow.js
│ │ │ │ ├── form.js
│ │ │ │ ├── jquery.js
│ │ │ │ ├── laydate.js
│ │ │ │ ├── layedit.js
│ │ │ │ ├── layer.js
│ │ │ │ ├── laypage.js
│ │ │ │ ├── laytpl.js
│ │ │ │ ├── mobile.js
│ │ │ │ ├── table.js
│ │ │ │ ├── tree.js
│ │ │ │ ├── upload.js
│ │ │ │ └── util.js
│ │ ├── layui.all.js
│ │ └── layui.js
│ └── templates
│ │ └── app
│ │ └── god
│ │ └── index.html
├── db
│ ├── __init__.py
│ ├── conn.py
│ └── setting.py
├── helper
│ ├── __init__.py
│ ├── app.py
│ ├── c_python.py
│ ├── file_server.py
│ ├── ftp.py
│ ├── image.py
│ ├── realpath.py
│ ├── scp.py
│ └── tietuku.py
├── lib
│ └── bangumi.py
└── models
│ ├── __init__.py
│ ├── anime_music
│ ├── __init__.py
│ ├── base.py
│ └── model.py
│ ├── base.py
│ └── settings.py
├── anime_music_icon.css
├── anime_music_icon.eot
├── anime_music_icon.svg
├── anime_music_icon.ttf
├── anime_music_icon.woff
├── demo.css
└── demo.html
/.gitignore:
--------------------------------------------------------------------------------
1 | *.idea
2 | *.pyc
3 | temp
4 | __test__
5 | certificate
6 | */aliyun/setting.py
7 | */helper/setting.py
8 | *.txt
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 xiaoC
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ### 所有音乐对应的动漫LOGO和BG图片已经补全完毕, 背景图都已补充2K画质图片 2023-3-28 19:09:29
2 | ### 已经开始着手修复图片不显示的问题(丢了...重新慢慢找) 2023-3-22 10:48:07
3 |
4 | # API
5 | #### 随机返回一首音乐
6 |
7 | > 请求URL: https://anime-music.jijidown.com/api/v2/music
8 |
9 | > 请求方式: GET
10 |
11 | > 请求参数:
recommend bool 非必须 #是否只返回推荐曲目
12 |
13 | > 返回内容:
14 | ```
15 | {
16 | msg: "ok",
17 | code: 0,
18 | res: {
19 | anime_info: {
20 | bg: "http://i1.fuimg.com/510372/a7d92b4163395fd3.jpg",
21 | year: 2014,
22 | id: "5b8369c4b02de2130c916266",
23 | title: "境界触发者",
24 | atime: 1425915035,
25 | desc: "某一天﹐通往异世界的门打开了﹐从异世界而来的侵略者“近界民”﹐蹂躏门附近的地区﹐街上被恐怖所覆盖。 突然出现的迷之团体“BORDER”击退了“近界民”﹐为了对抗陆续来袭的“近界民”﹐并在这边的世界建成基地。 四年后﹐“近界民”空闲游真从异世界来到日本寻找父亲的熟人﹐并遇上三云修。 修为了解“近界民”的真相﹐决定指引及监视人生路不熟的游真﹐两人的故事随着“BORDER”与“近界民”的战斗展开。",
26 | logo: "http://i1.fuimg.com/510372/29d718b13038e23b.jpg",
27 | month: 10,
28 | },
29 | play_url: "http://anime-music.files.jijidown.com/5b84dfd7b02de2088268793e_128.mp3?t=1538018792&sign=50FDEEE90BCB0612BD9C0C2E3CE4FF46",
30 | type: "其他",
31 | recommend: true,
32 | title: "GIRIGIRI",
33 | atime: 1535434711,
34 | id: "5b84dfd7b02de2088268793e",
35 | author: "未知",
36 | },
37 | }
38 | ```
39 |
40 | #### 返回指定ID的信息
41 | > 请求URL: https://anime-music.jijidown.com/api/v2/music/5b84dfd7b02de2088268793e
42 |
43 | > 其他信息和上面的接口是一样的
44 |
45 | #### 搜索歌曲/动漫
46 | > 搜索歌曲请求URL: https://anime-music.jijidown.com/api/v2/music/search
47 | > 搜索动漫请求URL: https://anime-music.jijidown.com/api/v2/anime/search
48 |
49 | > 请求方式: GET
50 |
51 | > 请求参数:
52 |
key str 必须 #搜索关键词
53 |
limit int 非必须 #每页返回数量
54 |
page int 非必须 #页数
55 |
56 | > 请求示例:
57 |
https://anime-music.jijidown.com/api/v2/music/search?key=%E7%9A%84&limit=5&page=1
58 |
https://anime-music.jijidown.com/api/v2/anime/search?key=%E7%9A%84&limit=5&page=1
59 |
60 | # 前端
61 | > 主要是用来给主站提供播放功能的一个小轮子, 包含完整的播放器功能, 提供了最常用的播放状态回调, 使用源生js实现。
62 |
63 | > DEMO: [https://jxiaoc.github.io/animeMusic/demo.html](https://jxiaoc.github.io/animeMusic/demo.html)
64 |
65 | ## 简易文档
66 |
67 | ### 事件
68 |
69 | ##### 监听播放器播放事件
70 |
71 | > animeMusic.onPlay = function() {console.log('play')};
72 |
73 | 当播放器开始播放时则会触发回调
74 |
75 | ##### 监听播放器播放事件(播放的渐入效果执行完毕)
76 |
77 | > animeMusic.onPlayed = function() {console.log('played')};
78 |
79 | 当播放器开始播放后, 1.1秒后触发此事件(1秒的播放淡入效果, 留0.1秒作为冗余)
80 |
81 | ##### 监听播放器暂停事件
82 |
83 | > animeMusic.onPause = function() {console.log('pause')};
84 |
85 | 当播放器开始播放时则会触发回调
86 |
87 | ##### 监听播放暂停事件(播放的渐入效果执行完毕)
88 |
89 | > animeMusic.onPaused = function() {console.log('paused')};
90 |
91 | 当播放器暂停播放后, 1.1秒后触发此事件(1秒的暂停淡出效果, 留0.1秒作为冗余)
92 |
93 | ##### 监听播放器当前播放进度
94 |
95 | > animeMusic.onProgress = function(per, now, all) {console.log('onProgress')};
96 |
97 | 返回的依次为播放百分比(Number), 当前播放时间(MM:SS), 总长度(MM:SS), 请根据需要使用, per可以用于控制进度条位置
98 |
99 | ##### 监听播放器开始加载
100 |
101 | > animeMusic.onLoad = function() {console.log('load')};
102 |
103 | 当播放器开始加载数据时则会触发此回调
104 |
105 | ##### 监听播放器加载完毕
106 |
107 | > animeMusic.onLoaded = function(res) {console.log(res)};
108 |
109 | 播放器加载完毕后会触发此回调,并且会传入res, 请根据res返回的数据进行页面填充, res格式详见最上方API
110 |
111 | ### 方法
112 |
113 | ##### 播放
114 |
115 | > animeMusic.Play();
116 |
117 | PS:第一次播放请使用animeMusic.Next(); 详细方法见demo
118 |
119 | ##### 暂停
120 |
121 | > animeMusic.Pause();
122 |
123 | ##### 下一曲
124 |
125 | > animeMusic.Next(); 或 animeMusic.Next(id);
126 |
127 | 传入id将会播放指定id的音乐,否则随机返回一首, id在onLoaded事件中会作为回调参数传入, res.id为音乐id, res.anime_info.id为该音乐对应动漫的id
128 |
129 | ##### 从指定位置开始播放
130 |
131 | > animeMusic.PlayTo(percentage);
132 |
133 | 传入进度百分比, 比如animeMusic.PlayTo(50); 则从一半的位置开始播放, 不推荐直接调用此方法, 推荐使用下面的bindPlayTo方法
134 |
135 | ##### 绑定进度条后,实现从鼠标点击的指定位置开始播放
136 |
137 | > animeMusic.bindPlayTo(selectName);
138 |
139 | 传入进度条所在的选择器key, 例animeMusic.bindPlayTo('.player .progress');此时该进度条就拥有了点击播放的功能了, 详见demo中的示例代码
140 |
141 | ### 参数
142 |
143 | ##### 返回推荐曲目
144 |
145 | > animeMusic.recommend = true
146 |
147 | 请求将只会返回推荐的曲目, 在下次执行Next时生效, Next指定id时无效
148 |
149 | # 服务端
150 |
151 | > 服务器基于debian + nginx + python + redis + mongodb 开发
152 |
153 | > 后台通过/god可以直接访问, python中没有做任何权限设置, 而是直接交由nginx处理, 详见[此文件](https://github.com/JxiaoC/animeMusic/blob/master/animeMusic_server/anime_music/nginx/anime-music.jijidown.com.conf)
154 |
155 | > 图片存储在贴图库中, 通过官方API进行上传, 需要单独新建setting.py文件并且配置相应key, 在[此文件](https://github.com/JxiaoC/animeMusic/blob/master/animeMusic_server/helper/tietuku.py)中有详细注释
156 |
157 | > MP3文件分别存储在阿里云OSS和自建的文件服务器上, OSS主要用于备份, 文件服务器用于MP3播放器直链; 文件服务器的数据管理通过FTP实现, 所以需要在文件服务器上自己搭建好FTP, 并在配置文件中配置好相应参数; 所有的配置参数均在代码的注释中有详细说明, [OSS](https://github.com/JxiaoC/animeMusic/blob/master/animeMusic_server/aliyun/oss.py), [FTP](https://github.com/JxiaoC/animeMusic/blob/master/animeMusic_server/helper/ftp.py), [(现在用的SCP代替FTP上传)](https://github.com/JxiaoC/animeMusic/blob/master/animeMusic_server/helper/scp.py)
158 |
159 | > 同时为了降低文件服务器的负荷, 后台会将上传上来的MP3文件自动转码成128Kbps音质, 转码使用ffmpeg, 所以需要提前安装
160 |
sudo apt-get install ffmpeg
pip3 install ffmpy
161 |
162 | #### 服务端配置以及启动
163 |
164 | > 启动文件main.py在 animeMusic_server/anime_music中
165 |
166 | ##### daemon.sh 文件
167 | > daemon.sh文件主要负责主程序的启动和关闭
168 | >
./daemon.sh start ./daemon.sh stop
169 |
170 | > 这里只写一些不常见的参数, 其他参数看变量名应该也能知道是什么
171 | >
PORT_RANGE: 要监听的端口范围, 12040 12043 则为监听12040, 12041, 12042和12043共计4个端口, 也就意味着会启动4个线程
172 | >
PORT_RANGE的端口范围要和nginx配置中的upstream一一对应
173 |
174 | ##### restart.sh 文件
175 | > 负责启动和重启主程序, 通过调用daemon.sh的stop和start实现
176 |
177 | ##### main.py 文件
178 | > 主程序入口, 负责监听指定端口, 常驻后台处理http请求, 一般情况下不需要直接运行此文件, 推荐通过restart.sh文件启动
179 |
180 | # 文件服务器
181 |
182 | > 为了保证可用性(之前使用网盘盗链导致后来所有文件失效, 还好有做备份, 所以这次重构不在考虑放在别的地方了QAQ),所有MP3文件均存放在自己搭建的文件服务器上, 为了尽量保证可用性, 单线程限速512KB, 为了减少恶意盗链行为, 文件服务器基于openresty, 使用lua进行文件鉴权, 鉴权代码如下
183 |
184 | ```
185 | local request_uri = ngx.var.request_uri;
186 | local arg = ngx.req.get_uri_args();
187 | local key = 'key';
188 |
189 | local function auth(name, t, sign)
190 | if ngx.time() >= tonumber(t) then
191 | ngx.header.content_type = "text/plain";
192 | ngx.say('{"code": -1, "msg": "timeout"}');
193 | ngx.exit(400);
194 | end
195 | local _ = ngx.md5(name .. t .. key);
196 | if string.upper(_) ~= sign then
197 | ngx.header.content_type = "text/plain";
198 | ngx.say('{"code": -2, "msg": "sign fail"}');
199 | ngx.exit(400);
200 | end
201 | end
202 | if string.find(request_uri, '.mp3') then
203 | local file_name = string.sub(request_uri, 2, 25);
204 | local auth_pass = auth(file_name, arg['t'], arg['sign']);
205 | end
206 | ```
207 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-tactile
--------------------------------------------------------------------------------
/anime-music.js:
--------------------------------------------------------------------------------
1 | var animeMusic = {
2 | 'recommend': false,
3 | 'max_load_time': 10, // 最大加载时间, 一首歌的加载时间超过此数值, 将会直接跳到下一曲
4 | '_anime_music_player': new Audio(),
5 | '_loading': false,
6 | '_play_or_pauseing': false,
7 | '_setI_play': null,
8 | '_setI_pause': null,
9 | '_setI_progress': null,
10 | '_now_load_time': 0,
11 | 'Play': function () {
12 | if ((animeMusic._play_or_pauseing || !animeMusic._anime_music_player.paused)) return;
13 | animeMusic._play_or_pauseing = true;
14 | try {
15 | animeMusic.onPlay();
16 | }
17 | catch (e) {
18 | }
19 | if (animeMusic._anime_music_player.paused) {
20 | animeMusic._anime_music_player.play();
21 | animeMusic._setI_progress = setInterval(function () {
22 | animeMusic.progress();
23 | }, 333);
24 | animeMusic._setI_play = setInterval(function () {
25 | try {
26 | animeMusic._anime_music_player.volume += 0.01;
27 | }
28 | catch (e) {
29 | }
30 | }, 10);
31 | setTimeout(function () {
32 | clearInterval(animeMusic._setI_play);
33 | animeMusic._play_or_pauseing = false;
34 | try {
35 | animeMusic.onPlayed();
36 | }
37 | catch (e) {
38 | }
39 | }, 1100);
40 | } else {
41 | animeMusic.Next();
42 | }
43 | },
44 | 'PlayTo': function (percentage) {
45 | animeMusic._anime_music_player.currentTime = animeMusic._anime_music_player.duration * (percentage / 100);
46 | },
47 | 'Pause': function () {
48 | if (animeMusic._play_or_pauseing || animeMusic._anime_music_player.paused) return;
49 | animeMusic._play_or_pauseing = true;
50 | clearInterval(animeMusic._setI_progress);
51 | try {
52 | animeMusic.onPause();
53 | }
54 | catch (e) {
55 | }
56 | animeMusic._setI_pause = setInterval(function () {
57 | try {
58 | animeMusic._anime_music_player.volume -= 0.01;
59 | }
60 | catch (e) {
61 | }
62 | }, 10);
63 | setTimeout(function () {
64 | clearInterval(animeMusic._setI_pause);
65 | animeMusic._anime_music_player.pause();
66 | animeMusic._play_or_pauseing = false;
67 | try {
68 | animeMusic.onPaused();
69 | }
70 | catch (e) {
71 | }
72 | }, 1100);
73 | },
74 | 'Next': function (id) {
75 | if (animeMusic._loading) return;
76 | animeMusic._loading = true;
77 | try {
78 | animeMusic.onLoad();
79 | }
80 | catch (e) {
81 | }
82 | animeMusic.Pause();
83 | var url;
84 | if (id) url = '//anime-music.jijidown.com/api/v2/music/' + id + '?recommend=' + animeMusic.recommend.toString();
85 | else url = '//anime-music.jijidown.com/api/v2/music?recommend=' + animeMusic.recommend.toString();
86 | var xmlhttp = new XMLHttpRequest();
87 | xmlhttp.onreadystatechange = function () {
88 | if (xmlhttp.readyState == 4) {
89 | if (xmlhttp.status == 200) {
90 | var res = JSON.parse(xmlhttp.response).res;
91 | if (res.code != 0) {
92 | setTimeout(function () {
93 | animeMusic._anime_music_player.src = res.play_url;
94 | animeMusic.Play();
95 | animeMusic._now_load_time = 0;
96 | animeMusic._loading = false;
97 | try {
98 | animeMusic.onLoaded(res);
99 | }
100 | catch (e) {
101 | }
102 | }, 1300);
103 | } else {
104 | animeMusic._loading = false;
105 | setTimeout(function () {
106 | animeMusic.Next();
107 | }, 3000);
108 | console.log(res.msg);
109 | }
110 | }
111 | }
112 | };
113 | xmlhttp.onerror = function () {
114 | animeMusic._loading = false;
115 | setTimeout(function () {
116 | animeMusic.Next();
117 | }, 3000);
118 | console.log('xmlhttp.onerror');
119 | };
120 | xmlhttp.open("GET", url, true);
121 | xmlhttp.send();
122 | },
123 | 'progress': function () {
124 | try {
125 | var all_time = secondToDate(animeMusic._anime_music_player.duration);
126 | var now_time = secondToDate(animeMusic._anime_music_player.currentTime);
127 | var percentage = parseInt(animeMusic._anime_music_player.currentTime / animeMusic._anime_music_player.duration * 100);
128 | try {
129 | animeMusic.onProgress(percentage, now_time, all_time);
130 | }
131 | catch (e) {
132 | }
133 | }
134 | catch (e) {
135 | }
136 | },
137 | 'bindPlayTo': function (name) {
138 | var dom = document.querySelector(name);
139 | if (dom) {
140 | dom.onclick = function (ev) {
141 | var oEvent = ev || event;
142 | var left = oEvent.offsetX;
143 | var percentage = parseInt(left / dom.offsetWidth * 100);
144 | animeMusic.PlayTo(percentage);
145 | }
146 | }
147 | else {
148 | console.log('dom is not exists');
149 | }
150 | },
151 | 'onPlay': null,
152 | 'onPlayed': null,
153 | 'onPause': null,
154 | 'onPaused': null,
155 | 'onLoad': null,
156 | 'onLoaded': null,
157 | 'onProgress': null
158 | };
159 |
160 | function secondToDate(result) {
161 | var m = Math.floor((result / 60 % 60)) < 10 ? '0' + Math.floor((result / 60 % 60)) : Math.floor((result / 60 % 60));
162 | var s = Math.floor((result % 60)) < 10 ? '0' + Math.floor((result % 60)) : Math.floor((result % 60));
163 | ret = m + ":" + s;
164 | return ret == 'NaN:NaN' ? '00:00' : ret;
165 | }
166 |
167 | function GetQueryString(name) {
168 | var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
169 | var r = window.location.search.substr(1).match(reg);
170 | if (r != null) return unescape(r[2]);
171 | return null;
172 | }
173 |
174 | animeMusic._anime_music_player.onended = function () {
175 | animeMusic.Next();
176 | };
--------------------------------------------------------------------------------
/animeMusic_server/aliyun/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/animeMusic_server/aliyun/__init__.py
--------------------------------------------------------------------------------
/animeMusic_server/aliyun/oss.py:
--------------------------------------------------------------------------------
1 | import oss2
2 | from .import setting
3 |
4 | # setting参数说明
5 | # OSSKEY 阿里云AccessKey ID
6 | # OSSVALUE 阿里云Access Key Secret
7 | # 详见https://usercenter.console.aliyun.com/#/manage/ak
8 | ossauth = oss2.Auth(setting.OSSKEY, setting.OSSVALUE)
9 | if setting.Debug:
10 | ossendpoint = 'http://oss-cn-hangzhou.aliyuncs.com'
11 | else:
12 | ossendpoint = 'http://oss-cn-hangzhou-internal.aliyuncs.com'
13 | ossbucket = oss2.Bucket(ossauth, ossendpoint, setting.OSSNAME)
14 |
15 |
16 | def upload_file(key, path):
17 | try:
18 | if not ossbucket.object_exists(key):
19 | ossbucket.put_object_from_file(key, path)
20 | return True
21 | except:
22 | return False
23 |
24 |
25 | def del_file(key):
26 | try:
27 | if ossbucket.object_exists(key):
28 | ossbucket.delete_object(key)
29 | return True
30 | except:
31 | return False
32 |
33 |
34 | if __name__ == '__main__':
35 | upload_file('test.html', '/home/xiaoc/index.html')
36 | pass
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/README.md:
--------------------------------------------------------------------------------
1 | > sudo apt-get install ffmpeg
2 |
3 | > pip3 install ffmpy
4 |
5 | > 其他需要的运行库在运行时会直接通过报错的方式进行提示(没有就装)
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/apps/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/animeMusic_server/anime_music/apps/__init__.py
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/apps/app/__init__.py:
--------------------------------------------------------------------------------
1 |
2 | from turbo import register
3 |
4 | from .import app
5 | from .import appv2
6 | from .import god
7 |
8 | register.register_group_urls('/api/v1', [
9 | ('/music', app.MusicHeader),
10 | ('/music/([0-9a-f]{24})', app.MusicHeader),
11 | ])
12 |
13 | register.register_group_urls('/api/v2', [
14 | ('/music', appv2.MusicHeader),
15 | ('/music/([0-9a-f]{24})', appv2.MusicHeader),
16 | ('/music/list', appv2.MusicListHeader),
17 | ('/music/search', appv2.MusicSearchHeader),
18 | ('/anime/search', appv2.AnimeSearchHeader),
19 | ])
20 |
21 | register.register_group_urls('/god', [
22 | ('', god.GodHeader),
23 | ])
24 |
25 | register.register_group_urls('/god/api/v1', [
26 | ('/anime/list', god.AnimeListHeader),
27 | ('/anime/add', god.AnimeAddHeader),
28 | ('/anime/search_bangumi', god.AnimeSearchBangumiHeader),
29 | ('/anime/(save|del)/([0-9a-f]{24})', god.AnimeHeader),
30 | ('/anime/upload/(logo|bg)/([0-9a-f]{24})', god.AnimeUploadHeader),
31 |
32 | ('/music/list', god.MusicListHeader),
33 | ('/music/add/([0-9a-f]{24})', god.MusicAddHeader),
34 | ('/music/(save|del)/([0-9a-f]{24})', god.MusicHeader),
35 | ('/music/upload/([0-9a-f]{24})', god.MusicUploadHeader),
36 | ])
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/apps/app/app.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 |
3 | import turbo.log
4 | from .base import BaseHandler
5 | from helper import app
6 | logger = turbo.log.getLogger(__file__)
7 |
8 |
9 | class MusicHeader(BaseHandler):
10 | def get(self, id=None):
11 | recommend = self.get_argument('recommend', '0')
12 | info = app.get_music_info(id, recommend)
13 | self.write(info)
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/apps/app/appv2.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 |
3 | import turbo.log
4 | from .base import BaseHandler
5 | from helper import app
6 | logger = turbo.log.getLogger(__file__)
7 |
8 |
9 | class MusicHeader(BaseHandler):
10 | def get(self, id=None):
11 | recommend = self.get_argument('recommend', '0')
12 | info = app.get_music_info(id, recommend)
13 | self.write({'code': 0, 'msg': 'ok', 'res': info})
14 |
15 |
16 | class MusicListHeader(BaseHandler):
17 | def get(self):
18 | limit = int(self.get_argument('limit', 15))
19 | page = int(self.get_argument('limit', 1))
20 | info = app.get_music_list(limit, page)
21 | self.write({'code': 0, 'msg': 'ok', 'res': info})
22 |
23 |
24 | class MusicSearchHeader(BaseHandler):
25 | def get(self):
26 | key = self.get_argument('key', '')
27 | limit = int(self.get_argument('limit', 15))
28 | page = int(self.get_argument('limit', 1))
29 | res = app.search_music(key, limit, page)
30 | self.write({'code': 0, 'msg': 'ok', 'res': res})
31 |
32 |
33 | class AnimeSearchHeader(BaseHandler):
34 | def get(self):
35 | key = self.get_argument('key', '')
36 | limit = int(self.get_argument('limit', 15))
37 | page = int(self.get_argument('limit', 1))
38 | res = app.search_anime(key, limit, page)
39 | self.write({'code': 0, 'msg': 'ok', 'res': res})
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/apps/app/base.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 |
3 | import turbo
4 |
5 | class BaseHandler(turbo.app.BaseHandler):
6 | def initialize(self):
7 | super(BaseHandler,self).initialize()
8 |
9 | def prepare(self):
10 | self.set_header("Access-Control-Allow-Origin", "*")
11 | self.set_header("Access-Control-Allow-Headers", "x-requested-with")
12 | self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
13 |
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/apps/app/god.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 |
3 | import turbo.log
4 | from bson import ObjectId
5 |
6 | import tornado
7 | import redis
8 | import time
9 | import threading
10 | import os
11 | from models.anime_music import model
12 | from helper.c_python import c_python as cp
13 | from helper import image
14 | from helper import tietuku
15 | from helper import file_server
16 | from helper import ftp
17 | from lib import bangumi
18 | from aliyun import oss
19 | from tornado import gen
20 | from tornado.concurrent import run_on_executor
21 | from concurrent.futures import ThreadPoolExecutor
22 | import hashlib
23 |
24 | logger = turbo.log.getLogger(__file__)
25 |
26 | tb_anime = model.AnimeList()
27 | tb_music = model.MusicList()
28 |
29 | r = redis.Redis(host='127.0.0.1', port=6379,db=0)
30 |
31 |
32 | def Sign(self):
33 | m2 = hashlib.md5()
34 | m2.update('%s%s{AnimeToken}' % (self.av, self.url))
35 | sign = m2.hexdigest().upper()
36 | return True if sign == self.sign else False
37 |
38 |
39 | def GetSignUrl(id):
40 | timeout = int(time.time() + 3600)
41 | m2 = hashlib.md5()
42 | m2.update(('%s%s{AnimeToken}' % (id, timeout)).encode('utf-8'))
43 | return 'http://anime-music-files.jijidown.com/%s_128.mp3?t=%s&sign=%s' % (id, timeout, m2.hexdigest().upper())
44 |
45 |
46 | class GodHeader(turbo.app.BaseHandler):
47 | def get(self):
48 | self.render('app/god/index.html')
49 |
50 |
51 | class AnimeListHeader(turbo.app.BaseHandler):
52 | def get(self):
53 | search_value = self.get_argument('search_value', '')
54 | search_type = self.get_argument('search_type', '')
55 | page = int(self.get_argument('page', 1))
56 | if page <= 0: page = 1
57 |
58 | limit = int(self.get_argument('limit', 10))
59 | if limit <=0 or limit >= 100: limit = 10
60 |
61 | Q = {}
62 | if search_value and search_type in ['title', '_id']:
63 | if search_type == '_id':
64 | Q[search_type] = ObjectId(search_value)
65 | else:
66 | Q[search_type] = {'$regex': search_value}
67 |
68 | _list = tb_anime.find(Q).sort('atime', -1).limit(limit).skip((page - 1) * limit)
69 | count = tb_anime.find(Q).count()
70 |
71 | res = []
72 | for f in _list:
73 | f['atime'] = str(cp.unixtimeToDatetime(f.get('atime', 0)))
74 | res.append(cp.formatWriteJson(f))
75 |
76 | self.write({
77 | 'code': 0,
78 | 'msg': 'ok',
79 | 'count': count,
80 | 'data': res,
81 | })
82 |
83 |
84 | class AnimeAddHeader(turbo.app.BaseHandler):
85 | def post(self):
86 | title = self.get_argument('title', '')
87 | if tb_anime.find_one({'title': title}):
88 | self.write({'code': -1, 'msg': '已经存在相同的名称了'})
89 | return
90 | tb_anime.insert({
91 | 'title': title,
92 | 'atime': int(time.time()),
93 | 'desc': '',
94 | 'bg': '',
95 | 'logo': '',
96 | 'year': 0,
97 | 'month': 0,
98 | })
99 | self.write({'code': 0, 'msg': 'ok'})
100 |
101 |
102 | class AnimeSearchBangumiHeader(turbo.app.BaseHandler):
103 | def post(self):
104 | title = self.get_argument('title', '')
105 | res = bangumi.search(title)
106 | self.write({'code': 0, 'msg': 'ok', 'res': res})
107 |
108 |
109 | class AnimeHeader(turbo.app.BaseHandler):
110 | def post(self, type, id):
111 | if not id or not ObjectId.is_valid(id):
112 | return
113 | self.id = ObjectId(id)
114 | self.route(type)
115 |
116 | def do_save(self):
117 | title = self.get_argument('title', '')
118 | desc = self.get_argument('desc', '')
119 | year = int(self.get_argument('year', 0))
120 | month = int(self.get_argument('month', 0))
121 | bangumi_id = int(self.get_argument('bangumi_id', 0))
122 |
123 | tb_anime.update({'_id': self.id}, {'$set': {
124 | 'title': title,
125 | 'desc': desc,
126 | 'year': year,
127 | 'month': month,
128 | 'bangumi_id': bangumi_id,
129 | }})
130 | self.write({'code': 0, 'msg': 'ok'})
131 |
132 | def do_del(self):
133 | if tb_music.find({'anime_id': self.id}).count() > 0:
134 | self.write({'code': -1, 'msg': '数据库内还有音频数据,无法删除'})
135 | return
136 | tb_anime.remove({'_id': self.id})
137 | self.write({'code': 0, 'msg': 'ok'})
138 |
139 |
140 | class AnimeUploadHeader(turbo.app.BaseHandler):
141 | def post(self, type, id):
142 | try:
143 | if not id or not ObjectId.is_valid(id):
144 | return
145 | id = ObjectId(id)
146 |
147 | if not os.path.exists('temp'):
148 | os.mkdir('temp')
149 |
150 | file_path = 'temp/%s' % self.request.files['file'][0]['filename']
151 | out_file_path = file_path.replace('png', 'jpg')
152 | with open(file_path, 'wb') as f:
153 | f.write(self.request.files['file'][0]['body'])
154 |
155 | if type == 'logo':
156 | image.clipResizeImg(path=file_path, out_path=out_file_path, width=1220, height=604, quality=85)
157 | else:
158 | image.resizeImg(path=file_path, out_path=out_file_path, width=1920, quality=85)
159 |
160 | image_url = tietuku.uploadImgToTieTuKu(out_file_path)
161 |
162 | if os.path.exists(file_path):
163 | os.remove(file_path)
164 |
165 | if os.path.exists(out_file_path):
166 | os.remove(out_file_path)
167 |
168 | if image_url:
169 | tb_anime.update({'_id': id}, {'$set': {type: image_url}})
170 | self.write({'code': 0, 'msg': 'ok', 'src': image_url})
171 | else:
172 | self.write({'code': -1, 'msg': '上传失败'})
173 | except Exception as e:
174 | self.write({'code': -1, 'msg': e})
175 |
176 |
177 | class MusicListHeader(turbo.app.BaseHandler):
178 | def get(self):
179 | search_value = self.get_argument('search_value', '')
180 | search_type = self.get_argument('search_type', '')
181 | page = int(self.get_argument('page', 1))
182 | if page <= 0: page = 1
183 |
184 | limit = int(self.get_argument('limit', 10))
185 | if limit <=0 or limit >= 100: limit = 10
186 |
187 | Q = {}
188 | if search_value and search_type in ['title', '_id', 'anime_id']:
189 | if search_type in ['_id', 'anime_id']:
190 | Q[search_type] = ObjectId(search_value)
191 | else:
192 | Q[search_type] = {'$regex': search_value}
193 |
194 | _list = tb_music.find(Q).sort('atime', -1).limit(limit).skip((page - 1) * limit)
195 | count = tb_music.find(Q).count()
196 |
197 | res = []
198 | for f in _list:
199 | f['play_url'] = GetSignUrl(str(f['_id']))
200 | anime_info = tb_anime.find_one({'_id': f.get('anime_id', None)})
201 | if anime_info:
202 | f['anime_name'] = anime_info.get('title')
203 | else:
204 | f['anime_name'] = '未知'
205 | f['atime'] = str(cp.unixtimeToDatetime(f['atime']))
206 | res.append(cp.formatWriteJson(f))
207 |
208 | self.write({
209 | 'code': 0,
210 | 'msg': 'ok',
211 | 'count': count,
212 | 'data': res,
213 | })
214 |
215 |
216 | class MusicAddHeader(turbo.app.BaseHandler):
217 | def post(self, id):
218 | if not id or not ObjectId.is_valid(id):
219 | return
220 | id = ObjectId(id)
221 |
222 | title = self.get_argument('title', '')
223 | if tb_music.find_one({'title': title}):
224 | self.write({'code': -1, 'msg': '已经存在相同的名称了'})
225 | return
226 | tb_music.insert({
227 | 'title': title,
228 | 'atime': int(time.time()),
229 | 'anime_id': id,
230 | 'author': '',
231 | 'recommend': False,
232 | })
233 | self.write({'code': 0, 'msg': 'ok'})
234 |
235 |
236 | class MusicHeader(turbo.app.BaseHandler):
237 | @gen.coroutine
238 | def post(self, type, id):
239 | if not id or not ObjectId.is_valid(id):
240 | return
241 | self.id = ObjectId(id)
242 | self.route(type)
243 |
244 | def do_save(self):
245 | title = self.get_argument('title', '')
246 | author = self.get_argument('author', '')
247 | type = self.get_argument('type', '')
248 | recommend = True if self.get_argument('recommend', 'true') == 'true' else False
249 |
250 | tb_music.update({'_id': self.id}, {'$set': {
251 | 'title': title,
252 | 'type': type,
253 | 'author': author,
254 | 'recommend': recommend,
255 | }})
256 | self.write({'code': 0, 'msg': 'ok'})
257 | self.finish()
258 |
259 | def do_del(self):
260 | tb_music.remove({'_id': self.id})
261 | _thread = threading.Thread(target=self.thread_del)
262 | _thread.start()
263 | self.write({'code': 0, 'msg': 'ok'})
264 | self.finish()
265 |
266 | def thread_del(self):
267 | name = '%s.mp3' % self.id
268 | oss.del_file(name)
269 | ftp.del_file(name.replace('.mp3', '_128.mp3'))
270 |
271 |
272 | class MusicUploadHeader(turbo.app.BaseHandler):
273 | executor = ThreadPoolExecutor(4)
274 |
275 | @gen.coroutine
276 | def post(self, id):
277 | image_url, error_data = yield self.upload(id)
278 | if image_url:
279 | self.write({'code': 0, 'msg': 'ok', 'src': GetSignUrl(str(id))})
280 | else:
281 | self.write({'code': -1, 'msg': '上传失败:' + error_data})
282 |
283 | @run_on_executor
284 | def upload(self, id):
285 | if not id or not ObjectId.is_valid(id):
286 | return
287 | id = ObjectId(id)
288 |
289 | if not os.path.exists('temp'):
290 | os.mkdir('temp')
291 |
292 | file_path = 'temp/%s' % self.request.files['file'][0]['filename']
293 | with open(file_path, 'wb') as f:
294 | f.write(self.request.files['file'][0]['body'])
295 |
296 | return file_server.upload_file_to_oss_and_scp(file_path, '%s.mp3' % id)
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/apps/app/setting.py:
--------------------------------------------------------------------------------
1 | #-*- coding:utf-8 -*-
2 |
3 | # sub app setting
4 | # try not to include function or class
5 |
6 | import os
7 | SERVER_DIR = os.path.dirname(os.path.abspath(__file__))
8 |
9 | if os.path.exists(os.path.join(SERVER_DIR, '__test__')):
10 | Debug = True
11 | else:
12 | Debug = False
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/apps/settings.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 |
3 | # installed app list
4 | INSTALLED_APPS = (
5 | 'app',
6 | )
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/daemon.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | usage="Usage: $0 [start | stop]"
4 |
5 | PORT_RANGE="12040 12043"
6 | service="anime-music-server"
7 | LOG_DIR="/tmp/jijidown/$service"
8 | pid="$LOG_DIR/service.pid"
9 | log="$LOG_DIR/service.log"
10 |
11 |
12 | ROOTDIR=$(dirname $0)
13 | MAIN=$ROOTDIR/main.py
14 |
15 |
16 | if [ ! -d $LOG_DIR ]; then
17 | mkdir -p "$LOG_DIR"
18 | fi
19 |
20 | case $1 in
21 | (start)
22 |
23 | for i in `seq $PORT_RANGE`
24 | do
25 | _pid=$pid.$i
26 | if [ -f $_pid ]; then
27 | if kill -0 `cat $_pid` > /dev/null 2>&1; then
28 | echo $service running as process `cat $_pid`. Stop it first.
29 | exit 1
30 | fi
31 | fi
32 |
33 | echo [port: $i] starting $service ...
34 |
35 | nohup python3 $MAIN --port=$i >"$log.$i" 2>&1 < /dev/null &
36 | echo $! > "$_pid"
37 | sleep 0.5; head "$log.$i"
38 | done
39 | ;;
40 |
41 | (stop)
42 |
43 | for i in `seq $PORT_RANGE`
44 | do
45 | _pid=$pid.$i
46 | if [ -f $_pid ]; then
47 | if kill -0 `cat $_pid` > /dev/null 2>&1; then
48 | echo [port: $i] stopping $service `cat $_pid`...
49 | kill `cat $_pid`
50 | else
51 | echo no $service to stop
52 | fi
53 | else
54 | echo no $service to stop
55 | fi
56 | done
57 | ;;
58 |
59 | (test)
60 |
61 | python3 $MAIN --port=9000
62 | ;;
63 |
64 | (*)
65 | echo $usage
66 | exit 1
67 | ;;
68 |
69 | esac
70 |
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/main.py:
--------------------------------------------------------------------------------
1 | #-*- coding:utf-8 -*-
2 |
3 | from tornado.options import define, options
4 | import tornado.options
5 |
6 | import setting
7 | import turbo.register
8 | import turbo.app
9 |
10 | turbo.register.register_app(setting.SERVER_NAME, setting.TURBO_APP_SETTING, setting.WEB_APPLICATION_SETTING, __file__, globals())
11 |
12 | define("port", default=8885, type=int)
13 |
14 | if __name__ == '__main__':
15 | tornado.options.parse_command_line()
16 | turbo.app.start(options.port)
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/nginx/anime-music.jijidown.com.conf:
--------------------------------------------------------------------------------
1 | upstream anime_music_jijidown_com_server {
2 | server localhost:12040;
3 | server localhost:12041;
4 | server localhost:12042;
5 | server localhost:12043;
6 | }
7 |
8 | server {
9 | listen 80;
10 | server_name anime-music.jijidown.com;
11 |
12 | listen 443 ssl;
13 | ssl_certificate /home/xiaoc/wwwroot/JIJIDown_Python/anime_music/certificate/anime-music.jijidown.com.pem;
14 | ssl_certificate_key /home/xiaoc/wwwroot/JIJIDown_Python/anime_music/certificate/anime-music.jijidown.com.key;
15 | ssl_session_timeout 5m;
16 | ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
17 | ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
18 | ssl_prefer_server_ciphers on;
19 |
20 |
21 | access_log /var/log/nginx/anime-music.jijidown.com.log;
22 | error_log /var/log/nginx/anime-music.jijidown.com.err;
23 |
24 | location / {
25 | add_header X-Cached $upstream_cache_status;
26 | proxy_pass_header Server;
27 | proxy_set_header Host $http_host;
28 | proxy_redirect off;
29 | proxy_set_header X-Real-IP $remote_addr;
30 | proxy_set_header X-Scheme $scheme;
31 | proxy_pass http://anime_music_jijidown_com_server;
32 | }
33 |
34 | location /god {
35 | auth_basic "Need login";
36 | auth_basic_user_file /data/passwd/.htpasswd;
37 | add_header X-Cached $upstream_cache_status;
38 | proxy_pass_header Server;
39 | proxy_set_header Host $http_host;
40 | proxy_redirect off;
41 | proxy_set_header X-Real-IP $remote_addr;
42 | proxy_set_header X-Scheme $scheme;
43 | proxy_pass http://anime_music_jijidown_com_server;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/restart.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ROOTDIR=$(pwd)/$(dirname $0)
4 |
5 | $ROOTDIR/daemon.sh stop && sleep 1 && $ROOTDIR/daemon.sh start
6 |
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/script/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/animeMusic_server/anime_music/script/__init__.py
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/script/mongoIndex.py:
--------------------------------------------------------------------------------
1 | # coding=utf-8
2 | from __future__ import absolute_import
3 | import realpath
4 |
5 | from models.anime_music import model
6 |
7 | tb_anime_list = model.AnimeList()
8 | tb_anime_list.ensure_index([('title', -1), ('atime', -1)])
9 | tb_anime_list.ensure_index([('_id', -1), ('atime', -1)])
10 | tb_anime_list.ensure_index('tietukuname')
11 |
12 | music_list = model.MusicList()
13 | music_list.ensure_index('atime')
14 | music_list.ensure_index('recommend')
15 | music_list.ensure_index([('title', -1), ('atime', -1)])
16 | music_list.ensure_index([('_id', -1), ('atime', -1)])
17 | music_list.ensure_index([('anime_id', -1), ('atime', -1)])
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/script/realpath.py:
--------------------------------------------------------------------------------
1 | #-*- coding:utf-8 -*-
2 | import os
3 | import sys
4 |
5 | # load app path into sys.path
6 | def app_path_load(dir_level_num=3):
7 | app_root_path = os.path.abspath(__file__)
8 | for i in range(0, dir_level_num):
9 | app_root_path = os.path.dirname(app_root_path)
10 |
11 | sys.path.append(app_root_path)
12 |
13 |
14 | app_path_load()
15 |
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/script/savetoImage.py:
--------------------------------------------------------------------------------
1 | # coding=utf-8
2 | from __future__ import absolute_import
3 | import realpath
4 | import requests
5 | import os
6 |
7 | from models.anime_music import model
8 | from helper import tietuku
9 |
10 | tb_anime_list = model.AnimeList()
11 |
12 |
13 | def downloadAndUpload(title, url, filename):
14 | print('download for', title, url)
15 | with open("./" + filename, "wb") as code:
16 | code.write(requests.get(url).content)
17 | print('uploading...')
18 | img_url = tietuku.uploadImgToTieTuKu("./" + filename)
19 | try:
20 | os.remove("./" + filename)
21 | except:
22 | pass
23 | return img_url
24 |
25 |
26 | skip = 0
27 | limit = 100
28 | total = tb_anime_list.find({'tietukuname': None}).count()
29 | complete_num = 0
30 | while True:
31 | i = 0
32 | _list = tb_anime_list.find({'tietukuname': None}).limit(limit).skip(skip)
33 | for f in _list:
34 | i += 1
35 | try:
36 | logo = f['logo']
37 | bg = f['bg']
38 | if not logo and not bg:
39 | continue
40 | title = f['title']
41 | filename = '%s.jpg' % f['_id']
42 |
43 | new_logo = ''
44 | new_bg = ''
45 |
46 | if logo:
47 | new_logo = downloadAndUpload(title, logo, filename)
48 | if not new_logo:
49 | print('logo upload error')
50 | continue
51 | if bg:
52 | new_bg = downloadAndUpload(title, bg, filename)
53 | if not new_bg:
54 | print('bg upload error')
55 | continue
56 |
57 | tb_anime_list.update({'_id': f['_id']}, {'$set': {
58 | 'bg': new_bg,
59 | 'logo': new_logo,
60 | 'tietukuname': '419067339@qq.com',
61 | }})
62 |
63 | complete_num += 1
64 | print('(', complete_num, '/', total, ')', title)
65 | except Exception as e:
66 | print(e)
67 | pass
68 | if i == 0:
69 | print('complete')
70 | break
71 | skip += limit
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/setting.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 | from tornado.util import ObjectDict
4 |
5 | # server name
6 | SERVER_NAME = 'anime_music-server'
7 |
8 | # server dir
9 | SERVER_DIR = os.path.dirname(os.path.abspath(__file__))
10 | # project dir
11 | PROJECT_DIR = os.path.dirname(SERVER_DIR)
12 | sys.path.append(PROJECT_DIR)
13 |
14 | # tornado web application settings
15 | # details in http://www.tornadoweb.org/en/stable/web.html#tornado.web.Application.settings
16 | WEB_APPLICATION_SETTING = ObjectDict(
17 | static_path=os.path.join(SERVER_DIR, "static"),
18 | template_path=os.path.join(SERVER_DIR, "templates"),
19 | xsrf_cookies=False,
20 | cookie_secret="xxx-xxx-xxx",
21 | )
22 |
23 | # turbo app setting
24 | TURBO_APP_SETTING = ObjectDict(
25 | log=ObjectDict(
26 | log_path=os.path.join("/var/log/", SERVER_NAME+'.log'),
27 | log_size=500*1024*1024,
28 | log_count=3,
29 | ),
30 | session_config=ObjectDict({
31 | 'secret_key': 'fLjUfxqXtfNoIldA0AIJ'
32 | })
33 | )
34 |
35 |
36 | # check if app start in debug
37 | if os.path.exists(os.path.join(SERVER_DIR, '__test__')):
38 | WEB_APPLICATION_SETTING['debug'] = True
39 | TURBO_APP_SETTING.log.log_path = os.path.join("", SERVER_NAME+'.log')
40 |
41 |
42 |
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/static/css/layui.mobile.css:
--------------------------------------------------------------------------------
1 | /** layui-v2.4.2 MIT License By https://www.layui.com */
2 | blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7) format('woff'),url(../font/iconfont.ttf?v=1.0.7) format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}@-webkit-keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-left{-webkit-animation-name:layui-m-anim-left;animation-name:layui-m-anim-left}@-webkit-keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-right{-webkit-animation-name:layui-m-anim-right;animation-name:layui-m-anim-right}@-webkit-keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.layui-m-anim-lout{-webkit-animation-name:layui-m-anim-lout;animation-name:layui-m-anim-lout}@-webkit-keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}.layui-m-anim-rout{-webkit-animation-name:layui-m-anim-rout;animation-name:layui-m-anim-rout}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px}
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/static/css/layui.mobile.min.css:
--------------------------------------------------------------------------------
1 | blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix)format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7)format('woff'),url(../font/iconfont.ttf?v=1.0.7)format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont)format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-box,.layui-box*{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box*{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}@-webkit-keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-left{-webkit-animation-name:layui-m-anim-left;animation-name:layui-m-anim-left}@-webkit-keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-right{-webkit-animation-name:layui-m-anim-right;animation-name:layui-m-anim-right}@-webkit-keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.layui-m-anim-lout{-webkit-animation-name:layui-m-anim-lout;animation-name:layui-m-anim-lout}@-webkit-keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}.layui-m-anim-rout{-webkit-animation-name:layui-m-anim-rout;animation-name:layui-m-anim-rout}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer*{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px}/*end_sub*/
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/static/css/modules/code.css:
--------------------------------------------------------------------------------
1 | /** layui-v2.2.45 MIT License By http://www.layui.com */
2 | html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/static/css/modules/laydate/default/laydate.css:
--------------------------------------------------------------------------------
1 | /** layui-v2.2.45 MIT License By http://www.layui.com */
2 | .laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:laydate-upbit;animation-name:laydate-upbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@-webkit-keyframes laydate-upbit{from{-webkit-transform:translate3d(0,20px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes laydate-upbit{from{transform:translate3d(0,20px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.laydate-set-ym span,.layui-laydate-header i{padding:0 5px;cursor:pointer}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;color:#999;font-size:18px}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;height:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px 20px}.layui-laydate-footer span{margin-right:15px;display:inline-block;cursor:pointer;font-size:12px}.layui-laydate-footer span:hover{color:#5FB878}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{height:26px;line-height:26px;margin:0 0 0 -1px;padding:0 10px;border:1px solid #C9C9C9;background-color:#fff;white-space:nowrap;vertical-align:top;border-radius:2px}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-0 .laydate-next-m,.layui-laydate-range .laydate-main-list-0 .laydate-next-y,.layui-laydate-range .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#00F7DE}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eaeaea;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/static/css/modules/layer/default/icon-ext.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/animeMusic_server/anime_music/static/css/modules/layer/default/icon-ext.png
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/static/css/modules/layer/default/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/animeMusic_server/anime_music/static/css/modules/layer/default/icon.png
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/static/css/modules/layer/default/layer.css:
--------------------------------------------------------------------------------
1 | /** layui-v2.2.45 MIT License By http://www.layui.com */
2 | .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/static/css/modules/layer/default/loading-0.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/animeMusic_server/anime_music/static/css/modules/layer/default/loading-0.gif
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/static/css/modules/layer/default/loading-1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/animeMusic_server/anime_music/static/css/modules/layer/default/loading-1.gif
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/static/css/modules/layer/default/loading-2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/animeMusic_server/anime_music/static/css/modules/layer/default/loading-2.gif
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/animeMusic_server/anime_music/static/favicon.ico
--------------------------------------------------------------------------------
/animeMusic_server/anime_music/static/god/anime.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
无匹配项
'):k.find("."+r).remove()},"keyup"),void(""===i&&k.find("."+r).remove()))};f&&m.on("keyup",w).on("blur",function(i){e=m,d=k.find("."+s).html(),setTimeout(function(){C(m.val(),function(e){d||m.val("")},"blur")},200)}),g.on("click",function(){var e=i(this),a=e.attr("lay-value"),n=h.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?m.val(""):(m.val(e.text()),e.addClass(s)),e.siblings().removeClass(s),h.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:h[0],value:a,othis:t}),b(!0),!1)}),t.find("dl>dt").on("click",function(e){return!1}),i(document).off("click",y).on("click",y)}};f.each(function(e,l){var r=i(this),o=r.next("."+a),u=this.disabled,d=l.value,f=i(l.options[l.selectedIndex]),y=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var v="string"==typeof r.attr("lay-search"),p=y?y.value?t:y.innerHTML||t:t,m=i(['")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"
"),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"
"),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['