├── .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 | 4 | 5 | Anime 6 | 7 | 8 | 9 | 10 | 56 | 57 | 58 |
59 |
60 | 64 |
65 |
66 | 67 |
68 | 69 | 70 | 71 |
72 |
73 | 75 |
76 | 77 |
78 |
79 | 80 |
81 | 82 | 87 | 88 |
89 |
90 | 详细信息 91 |
92 |
93 | 94 |
95 | 97 |
98 |
99 |
100 | 101 |
102 | 104 |
105 |
106 |
107 | 108 |
109 |
110 | 112 |
113 |
114 | 115 |
116 |
117 |
118 |
119 | 120 |
121 |
122 | 126 |
127 |
128 | 129 |
130 |
131 |
132 | 133 |

134 |
135 |
136 |
137 |
138 |
139 | 140 |
141 | 142 |
143 |
144 |
145 |
146 | 147 |
148 | 149 |
150 |
-
151 |
152 | 153 |
154 |
155 |
156 |
157 |
158 | 159 |
160 |
161 |
162 | 163 | 425 | 426 | 427 | -------------------------------------------------------------------------------- /animeMusic_server/anime_music/static/god/music.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Music 6 | 7 | 8 | 9 | 10 | 23 | 24 | 25 |
26 | 39 |
40 |
41 | 42 |
43 | 44 |
45 |
46 | 47 |
48 | 49 | 54 | 55 |
56 |
57 | 详细信息 58 |
59 |
60 | 61 |
62 | 64 |
65 |
66 |
67 | 68 |
69 | 70 |
71 |
72 |
73 | 74 |
75 | 84 |
85 |
86 |
87 | 88 |
89 | 90 |
91 |
92 |
93 | 94 |
95 | 96 |
97 |
98 |
99 | 100 |
101 |
103 |
104 |
105 |
106 |
107 |
108 | 109 |

110 |
111 |
112 |
113 |
114 |
115 |
116 | 117 |
118 |
119 |
120 | 121 | 321 | 322 | 323 | -------------------------------------------------------------------------------- /animeMusic_server/anime_music/static/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/animeMusic_server/anime_music/static/img/logo.png -------------------------------------------------------------------------------- /animeMusic_server/anime_music/static/lay/modules/carousel.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
"].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
  1. '+o.replace(/[\r\t\n]+/g,"
  2. ")+"
"),c.find(">.layui-code-h3")[0]||c.prepend('

'+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); -------------------------------------------------------------------------------- /animeMusic_server/anime_music/static/lay/modules/element.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(i){"use strict";var t=layui.$,a=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(i){var a=this;return t.extend(!0,a.config,i),a},s.prototype.on=function(i,t){return layui.onevent.call(this,e,i,t)},s.prototype.tabAdd=function(i,a){var e=".layui-tab-title",l=t(".layui-tab[lay-filter="+i+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),c='
  • '+(a.title||"unnaming")+"
  • ";return s[0]?s.before(c):n.append(c),o.append('
    '+(a.content||"")+"
    "),y.hideTabMore(!0),y.tabAuto(),this},s.prototype.tabDelete=function(i,a){var e=".layui-tab-title",l=t(".layui-tab[lay-filter="+i+"]"),n=l.children(e),s=n.find('>li[lay-id="'+a+'"]');return y.tabDelete(null,s),this},s.prototype.tabChange=function(i,a){var e=".layui-tab-title",l=t(".layui-tab[lay-filter="+i+"]"),n=l.children(e),s=n.find('>li[lay-id="'+a+'"]');return y.tabClick(null,null,s),this},s.prototype.tab=function(i){i=i||{},v.on("click",i.headerElem,function(a){var e=t(this).index();y.tabClick.call(this,a,e,null,i)})},s.prototype.progress=function(i,a){var e="layui-progress",l=t("."+e+"[lay-filter="+i+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",a),s.text(a),this};var o=".layui-nav",c="layui-nav-item",r="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",h="layui-nav-more",f="layui-anim layui-anim-upbit",y={tabClick:function(i,a,s,o){o=o||{};var c=s||t(this),a=a||c.parent().children("li").index(c),r=o.headerElem?c.parent():c.parents(".layui-tab").eq(0),u=o.bodyElem?t(o.bodyElem):r.children(".layui-tab-content").children(".layui-tab-item"),d=c.find("a"),h=r.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(c.addClass(l).siblings().removeClass(l),u.eq(a).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+h+")",{elem:r,index:a})},tabDelete:function(i,a){var n=a||t(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),c=o.children(".layui-tab-content").children(".layui-tab-item"),r=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?y.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&y.tabClick.call(n.prev()[0],null,s-1)),n.remove(),c.eq(s).remove(),setTimeout(function(){y.tabAuto()},50),layui.event.call(this,e,"tabDelete("+r+")",{elem:o,index:s})},tabAuto:function(){var i="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;t(".layui-tab").each(function(){var s=t(this),o=s.children(".layui-tab-title"),c=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),r=t('');if(n===window&&8!=a.ie&&y.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var i=t(this);if(!i.find("."+l)[0]){var a=t('');a.on("click",y.tabDelete),i.append(a)}}),o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(r),s.attr("overflow",""),r.on("click",function(t){o[this.title?"removeClass":"addClass"](i),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(i){var a=t(".layui-tab-title");i!==!0&&"tabmore"===t(i.target).attr("lay-stope")||(a.removeClass("layui-tab-more"),a.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var i=t(this),a=i.parents(o),n=a.attr("lay-filter"),s=i.find("a"),c="string"==typeof i.attr("lay-unselect");i.find("."+d)[0]||("javascript:;"!==s.attr("href")&&"_blank"===s.attr("target")||c||(a.find("."+l).removeClass(l),i.addClass(l)),layui.event.call(this,e,"nav("+n+")",i))},clickChild:function(){var i=t(this),a=i.parents(o),n=a.attr("lay-filter");a.find("."+l).removeClass(l),i.addClass(l),layui.event.call(this,e,"nav("+n+")",i)},showChild:function(){var i=t(this),a=i.parents(o),e=i.parent(),l=i.siblings("."+d);a.hasClass(u)&&(l.removeClass(f),e["none"===l.css("display")?"addClass":"removeClass"](c+"ed"))},collapse:function(){var i=t(this),a=i.find(".layui-colla-icon"),l=i.siblings(".layui-colla-content"),s=i.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),c="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var r=s.children(".layui-colla-item").children("."+n);r.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),r.removeClass(n)}l[c?"addClass":"removeClass"](n),a.html(c?"":""),layui.event.call(this,e,"collapse("+o+")",{title:i,content:l,show:c})}};s.prototype.init=function(i,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){y.tabAuto.call({})},nav:function(){var i=200,e={},s={},p={},v=function(l,o,c){var r=t(this),y=r.find("."+d);o.hasClass(u)?l.css({top:r.position().top,height:r.children("a").height(),opacity:1}):(y.addClass(f),l.css({left:r.position().left+parseFloat(r.css("marginLeft")),top:r.position().top+r.height()-l.height()}),e[c]=setTimeout(function(){l.css({width:r.width(),opacity:1})},a.ie&&a.ie<10?0:i),clearTimeout(p[c]),"block"===y.css("display")&&clearTimeout(s[c]),s[c]=setTimeout(function(){y.addClass(n),r.find("."+h).addClass(h+"d")},300))};t(o+l).each(function(a){var l=t(this),o=t(''),f=l.find("."+c);l.find("."+r)[0]||(l.append(o),f.on("mouseenter",function(){v.call(this,o,l,a)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[a]),s[a]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+h).removeClass(h+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[a]),p[a]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},i)})),f.each(function(){var i=t(this),a=i.find("."+d);if(a[0]&&!i.find("."+h)[0]){var e=i.children("a");e.append('')}i.off("click",y.clickThis).on("click",y.clickThis),i.children("a").off("click",y.showChild).on("click",y.showChild),a.children("dd").off("click",y.clickChild).on("click",y.clickChild)})})},breadcrumb:function(){var i=".layui-breadcrumb";t(i+l).each(function(){var i=t(this),a="lay-separator",e=i.attr(a)||"/",l=i.find("a");l.next("span["+a+"]")[0]||(l.each(function(i){i!==l.length-1&&t(this).after(""+e+"")}),i.css("visibility","visible"))})},progress:function(){var i="layui-progress";t("."+i+l).each(function(){var a=t(this),e=a.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),a.attr("lay-showPercent")&&setTimeout(function(){e.html(''+l+"")},350)})},collapse:function(){var i="layui-collapse";t("."+i+l).each(function(){var i=t(this).find(".layui-colla-item");i.each(function(){var i=t(this),a=i.find(".layui-colla-title"),e=i.find(".layui-colla-content"),l="none"===e.css("display");a.find(".layui-colla-icon").remove(),a.append(''+(l?"":"")+""),a.off("click",y.collapse).on("click",y.collapse)})})}};return s[i]?s[i]():layui.each(s,function(i,t){t()})},s.prototype.render=s.prototype.init;var p=new s,v=t(document);p.render();var b=".layui-tab-title li";v.on("click",b,y.tabClick),v.on("click",y.hideTabMore),t(window).on("resize",y.tabAuto),i(e,p)}); -------------------------------------------------------------------------------- /animeMusic_server/anime_music/static/lay/modules/flow.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('
    '+d+"
    ");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)}); -------------------------------------------------------------------------------- /animeMusic_server/anime_music/static/lay/modules/form.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var t=this;return i.extend(!0,t.config,e),t},u.prototype.verify=function(e){var t=this;return i.extend(!0,t.config.verify,e),t},u.prototype.on=function(e,i){return layui.onevent.call(this,l,e,i)},u.prototype.render=function(e,t){var n=this,u=i(r+function(){return t?'[lay-filter="'+t+'"]':""}()),d={select:function(){var e,t="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),y=function(t,l){i(t.target).parent().hasClass(n)&&!l||(i("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},h=function(t,u,f){var h=i(this),p=t.find("."+n),m=p.find("input"),k=t.find("dl"),g=k.children("dd");if(!u){var x=function(){var e=t.offset().top+t.outerHeight()+5-v.scrollTop(),i=k.outerHeight();t.addClass(a+"ed"),g.removeClass(o),e+i>v.height()&&e>=i&&t.addClass(a+"up")},b=function(e){t.removeClass(a+"ed "+a+"up"),m.blur(),e||C(m.val(),function(e){e&&(d=k.find("."+s).html(),m&&m.val(d))})};p.on("click",function(e){t.hasClass(a+"ed")?b():(y(e,!0),x()),k.find("."+r).remove()}),p.find(".layui-edge").on("click",function(){m.focus()}),m.on("keyup",function(e){var i=e.keyCode;9===i&&x()}).on("keydown",function(e){var i=e.keyCode;9===i?b():13===i&&e.preventDefault()});var C=function(e,t,a){var n=0;layui.each(g,function(){var t=i(this),l=t.text(),r=l.indexOf(e)===-1;(""===e||"blur"===a?e!==l:r)&&n++,"keyup"===a&&t[r?"addClass":"removeClass"](o)});var l=n===g.length;return t(l),l},w=function(e){var i=this.value,t=e.keyCode;return 9!==t&&13!==t&&37!==t&&38!==t&&39!==t&&40!==t&&(C(i,function(e){e?k.find("."+r)[0]||k.append('

    无匹配项

    '):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(['
    ','
    ','
    ','
    '+function(e){var i=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?i.push("
    "+a.label+"
    "):i.push('
    '+a.innerHTML+"
    "):i.push('
    '+(a.innerHTML||t)+"
    ")}),0===i.length&&i.push('
    没有选项
    '),i.join("")}(r.find("*"))+"
    ","
    "].join(""));o[0]&&o.remove(),r.after(m),h.call(this,m,u,v)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},t=u.find("input[type=checkbox]"),a=function(e,t){var a=i(this);e.on("click",function(){var i=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(t[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(t[1]).find("em").text(n[0])),layui.event.call(a[0],l,t[2]+"("+i+")",{elem:a[0],value:a[0].value,othis:e}))})};t.each(function(t,n){var l=i(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=i(['
    ',{_switch:""+((n.checked?s[0]:s[1])||"")+""}[r]||(n.title.replace(/\s/g,"")?""+n.title+"":"")+''+(r?"":"")+"","
    "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",t=["",""],a=u.find("input[type=radio]"),n=function(a){var n=i(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=i(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(t[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(t[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=i(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();var u=i(['
    ',''+t[l.checked?0:1]+"",""+(l.title||"未命名")+"","
    "].join(""));s[0]&&s.remove(),r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,i){i()}),n};var d=function(){var e=i(this),a=f.config.verify,s=null,o="layui-form-danger",c={},u=e.parents(r),d=u.find("*[lay-verify]"),y=e.parents("form")[0],v=u.find("input,select,textarea"),h=e.attr("lay-filter");if(layui.each(d,function(e,l){var r=i(this),c=r.attr("lay-verify").split("|"),u=r.attr("lay-verType"),d=r.val();if(r.removeClass(o),layui.each(c,function(e,i){var c,f="",y="function"==typeof a[i];if(a[i]){var c=y?f=a[i](d,l):!a[i][0].test(d);if(f=f||a[i][1],c)return"tips"===u?t.tips(f,function(){return"string"==typeof r.attr("lay-ignore")||"select"!==l.tagName.toLowerCase()&&!/^checkbox|radio$/.test(l.type)?r:r.next()}(),{tips:1}):"alert"===u?t.alert(f,{title:"提示",shadeClose:!0}):t.msg(f,{icon:5,shift:6}),n.android||n.ios||l.focus(),r.addClass(o),s=!0}}),s)return s}),s)return!1;var p={};return layui.each(v,function(e,i){if(i.name=(i.name||"").replace(/^\s*|\s*&/,""),i.name){if(/^.*\[\]$/.test(i.name)){var t=i.name.match(/^(.*)\[\]$/g)[0];p[t]=0|p[t],i.name=i.name.replace(/^(.*)\[\]$/,"$1["+p[t]++ +"]")}/^checkbox|radio$/.test(i.type)&&!i.checked||(c[i.name]=i.value)}}),layui.event.call(this,l,"submit("+h+")",{elem:this,form:y,field:c})},f=new u,y=i(document),v=i(window);f.render(),y.on("reset",r,function(){var e=i(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),y.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)}); -------------------------------------------------------------------------------- /animeMusic_server/anime_music/static/lay/modules/layedit.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define(["layer","form"],function(t){"use strict";var e=layui.$,i=layui.layer,a=layui.form,l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",c=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};c.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},c.prototype.on=function(t,e){return layui.onevent(n,t,e)},c.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",c=e("#"+t),u="LAY_layedit_"+ ++a.index,d=c.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['
    ','
    '+f+"
    ",'
    ','',"
    ","
    "].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

    ")}}),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:['

    "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
  • '+e+'
  • ')}),'"}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['"].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)}); -------------------------------------------------------------------------------- /animeMusic_server/anime_music/static/lay/modules/laypage.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),skip:function(){return['到第','','页',""].join("")}()};return['
    ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
    "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)}); -------------------------------------------------------------------------------- /animeMusic_server/anime_music/static/lay/modules/laytpl.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)}); -------------------------------------------------------------------------------- /animeMusic_server/anime_music/static/lay/modules/tree.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
      '),s=o(["
    • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return r.check?''+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
    • "].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('
      '));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})}); -------------------------------------------------------------------------------- /animeMusic_server/anime_music/static/lay/modules/upload.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,r,e,i)}},l=function(){var e=this;return{upload:function(i){e.upload.call(e,i)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var t=this;t.config=i.extend({},t.config,o.config,e),t.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var t=this,e=t.config;e.elem=i(e.elem),e.bindAction=i(e.bindAction),t.file(),t.events()},p.prototype.file=function(){var e=this,t=e.config,n=e.elemFile=i(['"].join("")),o=t.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&t.elem.wrap('
      '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,t=e.config,n=i(''),a=i(['
      ',"
      "].join(""));i("#"+f)[0]||i("body").append(n),t.elem.next().hasClass(f)||(e.elemFile.wrap(a),t.elem.next("."+f).append(function(){var e=[];return layui.each(t.data,function(i,t){e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var i=this;window.FileReader&&layui.each(i.chooseFiles,function(i,t){var n=new FileReader;n.readAsDataURL(t),n.onload=function(){e&&e(i,t,this.result)}})},p.prototype.upload=function(e,t){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){var t=0,n=0,a=e||o.files||o.chooseFiles||r.files,u=function(){l.multiple&&t+n===o.fileLength&&"function"==typeof l.allDone&&l.allDone({total:o.fileLength,successful:t,aborted:n})};layui.each(a,function(e,a){var r=new FormData;r.append(l.field,a),layui.each(l.data,function(e,i){r.append(e,i)}),i.ajax({url:l.url,type:l.method,data:r,contentType:!1,processData:!1,dataType:"json",success:function(i){t++,d(e,i),u()},error:function(){n++,o.msg("请求上传接口出现异常"),m(e),u()}})})},c=function(){var e=i("#"+f);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var i,t=e.contents().find("body");try{i=t.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}i&&(clearInterval(p.timer),t.html(""),d(0,i))},30)},d=function(e,i){if(o.elemFile.next("."+s).remove(),r.value="","object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(i,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},h=l.exts,v=function(){var i=[];return layui.each(e||o.chooseFiles,function(e,t){i.push(t.name)}),i}(),g={preview:function(e){o.preview(e)},upload:function(e,i){var t={};t[e]=i,o.upload(t)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,i){o.files[e]=i}),o.files}},y=function(){return"choose"===t?l.choose&&l.choose(g):(l.before&&l.before(g),a.ie?a.ie>9?u():c():void u())};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,i){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(i))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(o.fileLength=function(){var i=0,t=e||o.files||o.chooseFiles||r.files;return layui.each(t,function(){i++}),i}(),l.number&&o.fileLength>l.number)return o.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(layui.each(o.chooseFiles,function(e,i){if(i.size>1024*l.size){var t=l.size/1024;t=t>=1?Math.floor(t)+(t%1>0?t.toFixed(1):0)+"MB":l.size+"KB",r.value="",F=t}}),F)return o.msg("文件不能超过"+F)}y()}},p.prototype.events=function(){var e=this,t=e.config,o=function(i){e.chooseFiles={},layui.each(i,function(i,t){var n=(new Date).getTime();e.chooseFiles[n+"-"+i]=t})},l=function(i,n){var a=e.elemFile,o=i.length>1?i.length+"个文件":(i[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(s)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||t.choose||a.after(''+o+"")};t.elem.off("upload.start").on("upload.start",function(){var a=i(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=i.extend({},t,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||t.elem.off("upload.over").on("upload.over",function(){var e=i(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=i(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=i(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),t.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var i=this.files||[];o(i),t.auto?e.upload():l(i)}),t.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),t.elem.data("haveEvents")||(e.elemFile.on("change",function(){i(this).trigger("upload.change")}),t.elem.on("click",function(){e.isFile()||i(this).trigger("upload.start")}),t.drag&&t.elem.on("dragover",function(e){e.preventDefault(),i(this).trigger("upload.over")}).on("dragleave",function(e){i(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),i(this).trigger("upload.drop",e)}),t.bindAction.on("click",function(){i(this).trigger("upload.action")}),t.elem.data("haveEvents",!0))},o.render=function(e){var i=new p(e);return l.call(i)},e(r,o)}); -------------------------------------------------------------------------------- /animeMusic_server/anime_music/static/lay/modules/util.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var t=layui.$,i={fixbar:function(e){var i,o,a="layui-fixbar",r="layui-fixbar-top",n=t(document),l=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"":e.bar1,e.bar2=e.bar2===!0?"":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,""],g=t(['
        ',e.bar1?'
      • '+c[0]+"
      • ":"",e.bar2?'
      • '+c[1]+"
      • ":"",'
      • '+c[2]+"
      • ","
      "].join("")),s=g.find("."+r),u=function(){var t=n.scrollTop();t>=e.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};t("."+a)[0]||("object"==typeof e.css&&g.css(e.css),l.append(g),u(),g.find("li").on("click",function(){var i=t(this),o=i.attr("lay-type");"top"===o&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,o)}),n.on("scroll",function(){clearTimeout(o),o=setTimeout(function(){u()},100)}))},countdown:function(e,t,i){var o=this,a="function"==typeof t,r=new Date(e).getTime(),n=new Date(!t||a?(new Date).getTime():t).getTime(),l=r-n,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=t);var g=setTimeout(function(){o.countdown(e,n+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],t,g),l<=0&&clearTimeout(g),g},timeAgo:function(e,t){var i=this,o=[[],[]],a=(new Date).getTime()-new Date(e).getTime();return a>6912e5?(a=new Date(e),o[0][0]=i.digit(a.getFullYear(),4),o[0][1]=i.digit(a.getMonth()+1),o[0][2]=i.digit(a.getDate()),t||(o[1][0]=i.digit(a.getHours()),o[1][1]=i.digit(a.getMinutes()),o[1][2]=i.digit(a.getSeconds())),o[0].join("-")+" "+o[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=12e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var o=e.length;o0;r--)if("interactive"===o[r].readyState){e=o[r].src;break}return e||o[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),i=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},a="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",colorpicker:"modules/colorpicker",slider:"modules/slider",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};n.prototype.cache=o,n.prototype.define=function(e,t){var n=this,r="function"==typeof e,i=function(){var e=function(e,t){layui[e]=t,o.status[e]=!0};return"function"==typeof t&&t(function(n,r){e(n,r),o.callback[n]=function(){t(e)}}),this};return r&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?i.call(n):(n.use(e,i),n)},n.prototype.use=function(e,n,l){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[f]=t,d.removeChild(v),function r(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void(o.status[f]?c():setTimeout(r,4))}())}function c(){l.push(layui[f]),e.length>1?y.use(e.slice(1),n,l):"function"==typeof n&&n.apply(layui,l)}var y=this,p=o.dir=o.dir?o.dir:r,d=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(y.each(e,function(t,o){"jquery"===o&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var f=e[0],m=0;if(l=l||[],o.host=o.host||(p.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[f]||!layui["layui.all"]&&layui["layui.mobile"]&&u[f])return c(),y;if(o.modules[f])!function g(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void("string"==typeof o.modules[f]&&o.status[f]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[f]?p+"lay/":/^\{\/\}/.test(y.modules[f])?"":o.base||"")+(y.modules[f]||f)+".js";h=h.replace(/^\{\/\}/,""),v.async=!0,v.charset="utf-8",v.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),d.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||a?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),o.modules[f]=h}return y},n.prototype.getStyle=function(t,o){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](o)},n.prototype.link=function(e,n,r){var a=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof n&&(r=n);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,y=0;return u.rel="stylesheet",u.href=e+(o.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof n?a:(function p(){return++y>1e3*o.timeout/100?i(e+" timeout"):void(1989===parseInt(a.getStyle(t.getElementById(c),"width"))?function(){n()}():setTimeout(p,100))}(),a)},o.callback={},n.prototype.factory=function(e){if(layui[e])return"function"==typeof o.callback[e]?o.callback[e]:null},n.prototype.addcss=function(e,t,n){return layui.link(o.dir+"css/"+e,t,n)},n.prototype.img=function(e,t,o){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,"function"==typeof t&&t(n)},void(n.onerror=function(e){n.onerror=null,"function"==typeof o&&o(e)}))},n.prototype.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},n.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),n.prototype.extend=function(e){var t=this;e=e||{};for(var o in e)t[o]||t.modules[o]?i("模块名 "+o+" 已被占用"):t.modules[o]=e[o];return t},n.prototype.router=function(e){var t=this,e=e||location.hash,o={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,""),o.href="/"+e,e=e.replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),o.search[t[0]]=t[1]}():o.path.push(t)}),o):o},n.prototype.data=function(t,o,n){if(t=t||"layui",n=n||localStorage,e.JSON&&e.JSON.parse){if(null===o)return delete n[t];o="object"==typeof o?o:{key:o};try{var r=JSON.parse(n[t])}catch(i){var r={}}return"value"in o&&(r[o.key]=o.value),o.remove&&delete r[o.key],n[t]=JSON.stringify(r),o.key?r[o.key]:r}},n.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},n.prototype.device=function(t){var o=navigator.userAgent.toLowerCase(),n=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(o.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(o)?"windows":/linux/.test(o)?"linux":/iphone|ipod|ipad|ios/.test(o)?"ios":/mac/.test(o)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((o.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:n("micromessenger")};return t&&!r[t]&&(r[t]=n(t)),r.android=/android/.test(o),r.ios="ios"===r.os,r},n.prototype.hint=function(){return{error:i}},n.prototype.each=function(e,t){var o,n=this;if("function"!=typeof t)return n;if(e=e||[],e.constructor===Object){for(o in e)if(t.call(e[o],o,e[o]))break}else for(o=0;oi?1:r 2 | 3 | 4 | 5 | 6 | 后台管理系统 - layui 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
      18 |
      19 | 20 | 21 |
        22 |
      • 控制台
      • 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
      34 | 47 |
      48 | 49 |
      50 |
      51 | 52 | 61 |
      62 |
      63 | 64 |
      65 | 66 |
      67 |
      68 |
      69 | 70 | 74 |
      75 | 76 | 77 | 92 | 113 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /animeMusic_server/db/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/animeMusic_server/db/__init__.py -------------------------------------------------------------------------------- /animeMusic_server/db/conn.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | import os 4 | 5 | from pymongo import ( 6 | MongoReplicaSetClient, 7 | MongoClient, 8 | read_preferences 9 | ) 10 | import gridfs 11 | 12 | mc = MongoClient(host='localhost') 13 | anime_music = mc['anime_music'] -------------------------------------------------------------------------------- /animeMusic_server/db/setting.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | -------------------------------------------------------------------------------- /animeMusic_server/helper/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/animeMusic_server/helper/__init__.py -------------------------------------------------------------------------------- /animeMusic_server/helper/app.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from .import realpath 3 | from .import setting 4 | import random 5 | from bson import ObjectId 6 | import redis 7 | import time 8 | import hashlib 9 | import json 10 | 11 | from models.anime_music import model 12 | 13 | tb_anime = model.AnimeList() 14 | tb_music = model.MusicList() 15 | 16 | r = redis.Redis(host='127.0.0.1', port=6379, db=0) 17 | 18 | 19 | def GetSignUrl(id): 20 | timeout = int(time.time() + 3600) 21 | m2 = hashlib.md5() 22 | m2.update(('%s%s{AnimeToken}' % (id, timeout)).encode('utf-8')) 23 | return '%s/%s_128.mp3?t=%s&sign=%s' % (setting.FILESERVERHOST, id, timeout, m2.hexdigest().upper()) 24 | 25 | 26 | def get_music_info(id, recommend): 27 | if not id or not ObjectId.is_valid(id): 28 | id = ObjectId(get_random_id(recommend)) 29 | else: 30 | id = ObjectId(id) 31 | info = tb_music.find_one({'_id': id}) 32 | return format_music_info(info) 33 | 34 | 35 | def format_music_info(info): 36 | info['anime_info'] = get_anime_info(info.get('anime_id', None)) 37 | info['id'] = str(info.pop('_id')) 38 | info.pop('anime_id') 39 | info['play_url'] = GetSignUrl(info['id']) 40 | info['type'] = info.get('type', '其他') 41 | info['author'] = info.get('author', '未知') 42 | info['recommend'] = True if info.get('recommend', False) else False 43 | info['bangumi_id'] = info.get('bangumi_id', 0) 44 | return info 45 | 46 | 47 | def get_anime_info(animeid): 48 | if not animeid: 49 | return {} 50 | info = tb_anime.find_one({'_id': animeid}) 51 | info['id'] = str(info.pop('_id')) 52 | if 'tietukuname' in info.keys(): info.pop('tietukuname') 53 | return info 54 | 55 | 56 | def get_random_id(recommend): 57 | key = 'recommend_keys' if recommend == 'true' else 'keys' 58 | keys = r.get(key) 59 | if keys: 60 | keys = json.loads(keys.decode()) 61 | else: 62 | keys = [] 63 | Q = {} 64 | if recommend == 'true': 65 | Q = {'recommend': 1} 66 | list = tb_music.find(Q, {'_id': 1}) 67 | for f in list: 68 | keys.append(str(f['_id'])) 69 | r.set(key, json.dumps(keys)) 70 | r.expire(key, 600) 71 | 72 | return keys[random.randint(0, len(keys) - 1)] 73 | 74 | 75 | def get_music_list(limit, page): 76 | _list = tb_music.find().sort('atime', -1).limit(limit).skip((page - 1) * limit) 77 | res = [] 78 | for f in _list: 79 | f = format_music_info(f) 80 | f.pop('play_url') 81 | res.append(f) 82 | return res 83 | 84 | 85 | def search_music(key, limit, page): 86 | limit, page = int(limit), int(page) 87 | _list = tb_music.find({'title': {'$regex': key}}).sort('atime', -1).limit(limit).skip((page - 1) * limit) 88 | res = [] 89 | for f in _list: 90 | f = format_music_info(f) 91 | f.pop('play_url') # 因为play_url有时效性, 可能在使用的时候就已经失效了, 所以这里过滤掉. 92 | res.append(f) 93 | return res 94 | 95 | 96 | def search_anime(key, limit, page): 97 | anime_list = tb_anime.find({'title': {'$regex': key}}).sort('atime', -1) 98 | anime_ids = [] 99 | for f in anime_list: 100 | anime_ids.append(f['_id']) 101 | res = [] 102 | 103 | _list = tb_music.find({'anime_id': {'$in': anime_ids}}).sort('atime', -1).limit(limit).skip((page - 1) * limit) 104 | for f in _list: 105 | f = format_music_info(f) 106 | f.pop('play_url') # 因为play_url有时效性, 可能在使用的时候就已经失效了, 所以这里过滤掉. 107 | res.append(f) 108 | return res 109 | -------------------------------------------------------------------------------- /animeMusic_server/helper/c_python.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | import sys 3 | import urllib.request 4 | 5 | import datetime 6 | import requests 7 | import re 8 | import time 9 | import types 10 | import http.client 11 | from pyquery import PyQuery as pq # sudo pip install PyQuery 12 | 13 | 14 | class c_python: 15 | # 截取字符串 16 | @staticmethod 17 | def getString(data, startStr, endStr, contain=False): 18 | try: 19 | startIndex = 0 if startStr == '' else data.find(startStr) 20 | if data[startIndex:].find(endStr) == -1: 21 | return '' 22 | endIndex = len(data) if endStr == '' else data[startIndex:].find(endStr) + startIndex + endStr.__len__() 23 | if not contain: 24 | startIndex += startStr.__len__() 25 | endIndex -= endStr.__len__() 26 | return data[startIndex:endIndex] 27 | except: 28 | return '' 29 | 30 | # 删除字典中指定的key 31 | @staticmethod 32 | def removeDicKey(dic, keyList=[]): 33 | try: 34 | for k in keyList: 35 | if k == '': continue; 36 | if k in dic.keys(): 37 | dic.pop(k) 38 | return dic 39 | except: 40 | return dic 41 | 42 | # 将Str转换为datetime格式 43 | @staticmethod 44 | def strToTime(str, format='auto'): 45 | try: 46 | str_bak = str 47 | str = str.replace('年', '-').replace('月', '-').replace('日', '').replace('时', ':').replace('分', ':').replace( 48 | '秒', '') 49 | if str.endswith(':'): 50 | str = str[0:''.__len__() - 1] 51 | if re.match('\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}', str): 52 | format = '%Y-%m-%d %H:%M:%S' 53 | elif re.match('\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}', str): 54 | format = '%Y-%m-%d %H:%M' 55 | elif re.match('\d{4}-\d{1,2}-\d{1,2}', str): 56 | format = '%Y-%m-%d' 57 | else: 58 | str = str_bak 59 | num = re.findall('^\d*', str)[0] 60 | if num != '': 61 | num = int(num) 62 | time = datetime.datetime.now() 63 | str = str.replace('前', '').replace('分钟', '分').replace('小时', '时') 64 | if str.rfind('秒') > -1: 65 | return time + datetime.timedelta(seconds=-num) 66 | if str.rfind('分') > -1: 67 | return time + datetime.timedelta(minutes=-num) 68 | if str.rfind('时') > -1: 69 | return time + datetime.timedelta(hours=-num) 70 | if str.rfind('天') > -1: 71 | return time + datetime.timedelta(days=-num) 72 | if str.rfind('周') > -1: 73 | return time + datetime.timedelta(weeks=-num) 74 | if str.rfind('月') > -1: 75 | return time + datetime.timedelta(days=-(num*30)) 76 | 77 | date_time = datetime.datetime.strptime(str, format) 78 | return date_time 79 | except: 80 | return None 81 | 82 | # 将datetime转换为指定格式的字符串 83 | @staticmethod 84 | def getStrTime(time=datetime.datetime.now(), format='%Y-%m-%d'): 85 | try: 86 | return time.__format__(format) 87 | except: 88 | return None 89 | 90 | # 将时间戳转换为datetime 91 | @staticmethod 92 | def unixtimeToDatetime(timestamp): 93 | time_local = time.localtime(timestamp) 94 | return time.strftime("%Y-%m-%d %H:%M:%S", time_local) 95 | 96 | # 将datetime转换为时间戳 97 | @staticmethod 98 | def datetimeToUnixtime(_datetime): 99 | return time.mktime(_datetime.timetuple()) 100 | 101 | # 格式化输出的JSON数据 102 | @staticmethod 103 | def formatWriteJson(data): 104 | for key in data.keys(): 105 | if type(data[key]) not in ( 106 | int, str, bool, float, bytes,type(None)): 107 | data[key] = str(data[key]) 108 | return data 109 | 110 | 111 | class c_spider: 112 | defaultHeaders = { 113 | 'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36', 114 | 'Accept': '*/*', 115 | 'cache-control': "no-cache" 116 | } 117 | 118 | # 获取网页源代码 119 | @staticmethod 120 | def getHtml(url, headers=None, encode=None, maxError=3, timeout=10): 121 | error = 0 122 | while error < maxError: 123 | try: 124 | if not headers: 125 | headers = c_spider.defaultHeaders 126 | headers.__setitem__('Referer', url) 127 | 128 | request = urllib.request.Request(url) 129 | for key in headers: 130 | request.add_header(key, headers[key]) 131 | 132 | response = urllib.request.urlopen(request, timeout=timeout) 133 | html = response.read() 134 | if encode: 135 | return html.decode(encode) 136 | else: 137 | return html 138 | except: 139 | error += 1 140 | 141 | # 获取网页源代码 142 | @staticmethod 143 | def getHtmlForRequests(url, maxError=5, timeout=10, headers=None, encode=None): 144 | error = 0 145 | while error <= maxError: 146 | if not headers: 147 | headers = c_spider.defaultHeaders 148 | headers.__setitem__('Referer', url) 149 | 150 | response = requests.request("GET", url, headers=headers, timeout=timeout) 151 | html = response.text 152 | if not html.strip(): 153 | time.sleep(1) 154 | error += 1 155 | continue 156 | if encode: 157 | return html.decode(encode) 158 | else: 159 | return html 160 | 161 | @staticmethod 162 | def postForRequest(url='', params='', _data='', headers=None, encode=None, timeout=10): 163 | if not headers: 164 | headers = c_spider.defaultHeaders 165 | headers.__setitem__('Referer', url) 166 | 167 | response = requests.request('POST', url, data=_data, headers=headers, params=params, timeout=timeout) 168 | html = response.text 169 | if encode: 170 | return html.decode(encode) 171 | else: 172 | return html 173 | 174 | @staticmethod 175 | def postForRequestReturnHtmlAndCookie(url='', params='', _data='', headers=None, encode=None, timeout=10): 176 | if not headers: 177 | headers = c_spider.defaultHeaders 178 | headers.__setitem__('Referer', url) 179 | 180 | response = requests.request('POST', url, data=_data, headers=headers, params=params, timeout=timeout) 181 | html = response.text 182 | if encode: 183 | return html.decode(encode), ';'.join([(f[0] + '=' + f[1]) for f in response.cookies.items()]) 184 | else: 185 | return html, ';'.join([(f[0] + '=' + f[1]) for f in response.cookies.items()]) 186 | 187 | @staticmethod 188 | def post(url, _data, headers=None, ): 189 | if not headers: 190 | headers = c_spider.defaultHeaders 191 | headers.__setitem__('Referer', url) 192 | conn = http.client.HTTPConnection('www.51mokao.com'); 193 | conn.request(method="POST", url='/testpractice?id=11757', body=_data, headers=headers); 194 | # 返回处理后的数据 195 | response = conn.getresponse() 196 | return response.msg 197 | 198 | # 清理A标签 199 | @staticmethod 200 | def clearA(data): 201 | jq = pq(data) 202 | for f in jq('a'): 203 | f = pq(f) 204 | f.attr('href', None) 205 | return jq.outer_html() 206 | 207 | # 清理指定标签 clearLabel('...', ['a', 'img']) 208 | @staticmethod 209 | def clearLabel(data, name): 210 | for n in name: 211 | jq = pq(data)(n) 212 | for f in jq: 213 | f = pq(f) 214 | if data.find(f.outer_html()) > -1: 215 | data = data.replace(f.outer_html(), '') 216 | else: 217 | data = data.replace(f.html(), '') 218 | return data 219 | 220 | # 清除掉所有html标签 221 | @staticmethod 222 | def clearAllHtmlLabel(data): 223 | result, number = re.subn("<[\s\S]+?>", '', data) 224 | return result 225 | 226 | @staticmethod 227 | def clearLabelForContains(data, label, str): 228 | temp = pq(data)('%s:contains("%s")' % (label, str)).html() 229 | 230 | if temp and data.find(temp) > -1: 231 | data = data.replace(temp, '') 232 | return data 233 | 234 | # 删除掉多余的attr 235 | # selectStr: 即为选择器的表达式,JQ中$(".abc"),.abc则为表达式 236 | @staticmethod 237 | def removeAttr(data, selectStr, attrList=[]): 238 | jq = pq(data) 239 | for f in jq(selectStr): 240 | f = pq(f) 241 | for attr in attrList: 242 | f.remove_attr(attr) 243 | return jq.outer_html() 244 | 245 | # 补全URL(有些img之内的标签,其中src是相对路径,采集过后会导致图片无法显示,所以需要补全成绝对路径) 246 | @staticmethod 247 | def completionSrc(data, selectStr, host, attr='src'): 248 | jq = pq(data) 249 | for f in jq(selectStr): 250 | f = pq(f) 251 | if f.attr(attr).find('http') != 0: 252 | f.attr(attr, ('%s%s%s' % (host, ('' if f.attr(attr).find('/') == 0 else '/'), f.attr(attr)))) 253 | return jq.outer_html() 254 | 255 | 256 | if __name__ == '__main__': 257 | # html = c_python.getHtml('http://www.baidu.com') 258 | # print c_python.getString('asdasd132aabbccddee233dasdasd3adasd4', '132', '233de',True) 259 | pass 260 | -------------------------------------------------------------------------------- /animeMusic_server/helper/file_server.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | import os 3 | import urllib 4 | import time 5 | import traceback 6 | from .import realpath 7 | from .import setting 8 | from .import ftp 9 | from .import scp 10 | import aliyun.oss as oss 11 | from ffmpy import FFmpeg 12 | 13 | 14 | def upload_file_to_oss_and_ftp(file_path, name): 15 | print('uploadImgToOSSAndFtp, ', name) 16 | try: 17 | print('uploading to oss...') 18 | oss.upload_file(name, file_path) 19 | 20 | print('format mp3 file...') 21 | file_path_128 = file_path.replace('.mp3', '_128.mp3') 22 | get_mp3file(file_path, file_path_128) 23 | 24 | _128_name = name.replace('.mp3', '_128.mp3') 25 | 26 | print('uploading to ftp...') 27 | ftp.upload_file(file_path_128, _128_name) 28 | 29 | if os.path.exists(file_path): 30 | os.remove(file_path) 31 | if os.path.exists(file_path_128): 32 | os.remove(file_path_128) 33 | return '%s%s/%s' % (setting.FILESERVERHOST, setting.FTPDIR, _128_name), '' 34 | 35 | except: 36 | if os.path.exists(file_path): 37 | os.remove(file_path) 38 | return False, traceback.format_exc() 39 | 40 | 41 | def upload_file_to_oss_and_scp(file_path, name): 42 | print('uploadImgToOSSAndscp, ', name) 43 | try: 44 | print('uploading to oss...') 45 | oss.upload_file(name, file_path) 46 | 47 | print('format mp3 file...') 48 | file_path_128 = file_path.replace('.mp3', '_128.mp3') 49 | get_mp3file(file_path, file_path_128) 50 | 51 | _128_name = name.replace('.mp3', '_128.mp3') 52 | 53 | print('uploading to scp...') 54 | scp.ssh_scp_put(file_path_128, _128_name) 55 | 56 | if os.path.exists(file_path): 57 | os.remove(file_path) 58 | if os.path.exists(file_path_128): 59 | os.remove(file_path_128) 60 | return '%s%s/%s' % (setting.FILESERVERHOST, setting.FTPDIR, _128_name), '' 61 | 62 | except: 63 | if os.path.exists(file_path): 64 | os.remove(file_path) 65 | return False, traceback.format_exc() 66 | 67 | 68 | def get_mp3file(out_file_path, out_file_path_mp3): 69 | try: 70 | ff = FFmpeg(inputs={out_file_path: '-loglevel quiet'}, outputs={out_file_path_mp3: '-y'}) 71 | print(ff.cmd) 72 | ff.run() 73 | except: 74 | print(traceback.format_exc()) -------------------------------------------------------------------------------- /animeMusic_server/helper/ftp.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | import ftplib 3 | import traceback 4 | from .import setting 5 | 6 | # setting参数说明 7 | # FTPDIR: FTP上传文件目录, 使用/开头 8 | # FTPADDRESS: FTP地址, 推荐使用IP 9 | # FTPUSER: FTP登录账号 10 | # FTPASSWD: FTP登录密码 11 | def upload_file(file_path, name, to_dir=setting.FTPDIR): 12 | f = ftplib.FTP(setting.FTPADDRESS) 13 | f.login(setting.FTPUSER, setting.FTPASSWD) 14 | f.cwd(to_dir) 15 | bufsize = 1024 16 | fp = open(file_path, 'rb') 17 | f.storbinary('STOR ' + name, fp, bufsize) 18 | fp.close() 19 | 20 | 21 | def del_file(name, dir=setting.FTPDIR): 22 | f = ftplib.FTP(setting.FTPADDRESS) 23 | f.login(setting.FTPUSER, setting.FTPASSWD) 24 | f.cwd(dir) 25 | [(_name == name and f.delete(name)) for _name in f.nlst()] 26 | 27 | 28 | # 没有找到在FTP直接判定文件是否存在的方法, 无脑循环在文件较多时效率会极低, 也可以直接使用下面这种try ex的方式直接容错处理 29 | # def del_file(name, dir=setting.FTPDIR): 30 | # try: 31 | # f = ftplib.FTP(setting.FTPADDRESS) 32 | # f.login(setting.FTPUSER, setting.FTPASSWD) 33 | # f.cwd(dir) 34 | # f.delete(name) 35 | # except: 36 | # pass 37 | 38 | if __name__ == '__main__': 39 | # upload_file('/home/xiaoc/1.jpg', 'test.jpg', setting.FTPDIR) 40 | del_file('test.jpg') -------------------------------------------------------------------------------- /animeMusic_server/helper/image.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | # 图片处理代码基于http://fc-lamp.blog.163.com/blog/static/174566687201282424018946/小幅度修改 3 | 4 | from PIL import Image as image 5 | 6 | 7 | def resizeImg(**args): 8 | args_key = {'path': '', 'out_path': '', 'width': '', 'height': '', 'quality': 75} 9 | arg = {} 10 | for key in args_key: 11 | if key in args: 12 | arg[key] = args[key] 13 | else: 14 | arg[key] = None 15 | 16 | im = image.open(arg['path']) 17 | ori_w, ori_h = im.size 18 | widthRatio = heightRatio = None 19 | ratio = 1 20 | if (arg['width'] and ori_w and ori_w > arg['width']) or (arg['height'] and ori_h and ori_h > arg['height']): 21 | if arg['width'] and ori_w > arg['width']: 22 | widthRatio = float(arg['width']) / ori_w # 正确获取小数的方式 23 | if arg['height'] and ori_h > arg['height']: 24 | heightRatio = float(arg['height']) / ori_h 25 | 26 | if widthRatio and heightRatio: 27 | if widthRatio < heightRatio: 28 | ratio = widthRatio 29 | else: 30 | ratio = heightRatio 31 | 32 | if widthRatio and not heightRatio: 33 | ratio = widthRatio 34 | if heightRatio and not widthRatio: 35 | ratio = heightRatio 36 | 37 | newWidth = int(ori_w * ratio) 38 | newHeight = int(ori_h * ratio) 39 | else: 40 | newWidth = ori_w 41 | newHeight = ori_h 42 | 43 | im.resize((newWidth, newHeight), image.ANTIALIAS).convert('RGB').save(arg['out_path'], quality=arg['quality']) 44 | 45 | 46 | def clipResizeImg(**args): 47 | args_key = {'path': '', 'out_path': '', 'width': '', 'height': '', 'quality': 75} 48 | arg = {} 49 | for key in args_key: 50 | if key in args: 51 | arg[key] = args[key] 52 | 53 | im = image.open(arg['path']) 54 | ori_w, ori_h = im.size 55 | 56 | dst_scale = float(arg['height']) / arg['width'] # 目标高宽比 57 | 58 | width = ori_w 59 | height = int(width * dst_scale) 60 | 61 | x = 0 62 | y = (ori_h - height) / 3 63 | 64 | # 裁剪 65 | box = (x, y, width + x, height + y) 66 | # 这里的参数可以这么认为:从某图的(x,y)坐标开始截,截到(width+x,height+y)坐标 67 | # 所包围的图像,crop方法与php中的imagecopy方法大为不一样 68 | newIm = im.crop(box) 69 | im = None 70 | 71 | # 压缩 72 | ratio = float(arg['width']) / width 73 | newWidth = int(width * ratio) 74 | newHeight = int(height * ratio) 75 | newIm.resize((newWidth, newHeight), image.ANTIALIAS).convert('RGB').save(arg['out_path'], quality=arg['quality']) 76 | 77 | 78 | if __name__ == '__main__': 79 | clipResizeImg(path='/home/xiaoc/2.jpeg', out_path='/home/xiaoc/2.out.jpeg', width=1220, height=604, quality=85) -------------------------------------------------------------------------------- /animeMusic_server/helper/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/helper/scp.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | import paramiko, datetime 4 | from .import realpath 5 | from .import setting 6 | 7 | 8 | def ssh_scp_put(local_file, name): 9 | ssh = paramiko.SSHClient() 10 | ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 11 | ssh.connect(setting.SCP_IP, setting.SCP_PORT, setting.SCP_USER, setting.SCP_PASSWORD) 12 | a = ssh.exec_command('date') 13 | stdin, stdout, stderr = a 14 | print(stdout.read()) 15 | sftp = ssh.open_sftp() 16 | sftp.put(local_file, setting.SCP_REMOTE_DIR + name) 17 | 18 | 19 | if __name__ == '__main__': 20 | open('test.txt', 'wb').write(b'test') 21 | ssh_scp_put('test.txt', 'heihei.txt') -------------------------------------------------------------------------------- /animeMusic_server/helper/tietuku.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from .import setting 3 | import time 4 | import json 5 | import os 6 | import requests 7 | from turbo.core.exceptions import ResponseMsg 8 | 9 | 10 | 11 | def uploadImgToTieTuKu(file_path): 12 | exception = None 13 | Num = 0 14 | while Num < 3: 15 | try: 16 | Num += 1 17 | 18 | # 贴图库的token在http://www.tietuku.com/manager/createtoken可以获取到, 上传方式选择本地上传; 19 | # aid在http://www.tietuku.com/manager/album可以获取到, 就是相册的ID 20 | 21 | token, aid = setting.TieTuKuTOKEN, setting.TieTuKuAID 22 | 23 | data = { 24 | 'deadline': int(time.time()) + 60, 25 | 'from': 'file', 26 | 'aid': aid, 27 | 'Token': token 28 | } 29 | 30 | files = {'file': open(file_path, "rb")} 31 | 32 | reponse = requests.post('http://up.imgapi.com/', data=data, files=files) 33 | json_data = json.loads(reponse.text) 34 | if json_data.__len__() > 5: 35 | os.remove(file_path) 36 | return json_data['linkurl'] 37 | else: 38 | exception = json_data 39 | except: 40 | pass 41 | raise ResponseMsg(-1, exception) 42 | 43 | if __name__ == '__main__': 44 | print (uploadImgToTieTuKu('/home/xiaoc/1.jpg')) -------------------------------------------------------------------------------- /animeMusic_server/lib/bangumi.py: -------------------------------------------------------------------------------- 1 | # bangumi API 2 | import datetime 3 | import json 4 | from urllib.parse import quote 5 | from cPython import cPython as cp 6 | 7 | default_ua = 'xiaoc/AnimeMusic/1.0.0 (Web) (https://github.com/JxiaoC/animeMusic)' 8 | host = 'https://api.bgm.tv' 9 | 10 | 11 | def search(keywords: str): 12 | url = '%s/search/subject/%s?type=2&max_results=25&responseGroup=large' % (host, quote(keywords)) 13 | html = cp.get_html(url, headers={'user-agent': default_ua}) 14 | json_data = json.loads(html) 15 | res = [] 16 | for f in json_data.get('list', []): 17 | if f.get('air_date').startswith('0000'): 18 | air_date = datetime.datetime(1970, 1, 1) 19 | else: 20 | air_date = datetime.datetime.strptime(f.get('air_date'), '%Y-%m-%d') 21 | images = f.get('images', {}) 22 | res.append({ 23 | 'id': f['id'], 24 | 'name': f.get('name', ''), 25 | 'name_cn': f.get('name_cn', ''), 26 | 'desc': f.get('summary', ''), 27 | 'year': air_date.year, 28 | 'month': air_date.month, 29 | 'img': images.get('medium', '') if images else '', 30 | }) 31 | return res 32 | 33 | 34 | if __name__ == '__main__': 35 | print(search('蓝色监狱')) 36 | -------------------------------------------------------------------------------- /animeMusic_server/models/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/animeMusic_server/models/__init__.py -------------------------------------------------------------------------------- /animeMusic_server/models/anime_music/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/animeMusic_server/models/anime_music/__init__.py -------------------------------------------------------------------------------- /animeMusic_server/models/anime_music/base.py: -------------------------------------------------------------------------------- 1 | #-*- coding:utf-8 -*- 2 | 3 | from models.base import * 4 | 5 | 6 | class Model(BaseModel): 7 | def __init__(self): 8 | super(Model, self).__init__(db_name='anime_music') 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /animeMusic_server/models/anime_music/model.py: -------------------------------------------------------------------------------- 1 | #-*- coding:utf-8 -*- 2 | 3 | from .base import * 4 | from bson import ObjectId 5 | 6 | 7 | class AnimeList(Model): 8 | name = 'anime_list' 9 | 10 | """ 11 | id: 此字段只是为了方便之前的数据转移,现在没用了 12 | title: 标题 13 | desc: 描述 14 | bg: 背景图URL 15 | logo: 封面图URL 16 | atime: 添加时间,时间戳格式 17 | year: anime发行年份 18 | month: anime发行月份 19 | bangumi_id: 对应bangumi番剧id 20 | """ 21 | field = { 22 | 'title': (str, ''), 23 | 'desc': (str, ''), 24 | 'bg': (str, ''), 25 | 'atime': (int, 0), 26 | 'id': (str, ''), 27 | 'logo': (str, ''), 28 | 'year': (int, 0), 29 | 'month': (int, 0), 30 | 'bangumi_id': (int, 0), 31 | 'tietukuname': (str, ''), 32 | } 33 | 34 | 35 | class MusicList(Model): 36 | name = 'music_list' 37 | 38 | """ 39 | anime_id: 所属animeid 40 | title: 标题 41 | author: 作者 42 | atime: 添加时间,时间戳格式 43 | recommend: 是否为推荐, 1=true, 0=false 44 | type: 所属类型, op, ed, bgm, 角色歌, 其他 45 | """ 46 | field = { 47 | 'anime_id': (ObjectId, None), 48 | 'title': (str, ''), 49 | 'author': (str, ''), 50 | 'atime': (int, None), 51 | 'recommend': (int, 0), 52 | 'type': (str, ''), 53 | } -------------------------------------------------------------------------------- /animeMusic_server/models/base.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | from datetime import datetime 4 | import time 5 | 6 | from bson.objectid import ObjectId 7 | from pymongo import ASCENDING, DESCENDING 8 | 9 | import turbo.model 10 | 11 | from .settings import MONGO_DB_MAPPING as _MONGO_DB_MAPPING 12 | 13 | _PACKAGE_SPACE = globals() 14 | 15 | class MixinModel(turbo.model.MixinModel): 16 | 17 | package_space = _PACKAGE_SPACE 18 | 19 | 20 | class BaseModel(turbo.model.BaseModel, MixinModel): 21 | 22 | def __init__(self, db_name='test'): 23 | super(BaseModel, self).__init__(db_name, _MONGO_DB_MAPPING) -------------------------------------------------------------------------------- /animeMusic_server/models/settings.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | from db.conn import ( 4 | anime_music as _anime_music, 5 | ) 6 | 7 | MONGO_DB_MAPPING = { 8 | 'db': { 9 | 'anime_music': _anime_music, 10 | }, 11 | 'db_file': { 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /anime_music_icon.css: -------------------------------------------------------------------------------- 1 | 2 | @font-face {font-family: "iconfont"; 3 | src: url('anime_music_icon.eot?t=1535597309299'); /* IE9*/ 4 | src: url('anime_music_icon.eot?t=1535597309299#iefix') format('embedded-opentype'), /* IE6-IE8 */ 5 | url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAZUAAsAAAAACdwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFY9Ikj/Y21hcAAAAYAAAABgAAABnLWkIU1nbHlmAAAB4AAAAmwAAAOU3XEUMmhlYWQAAARMAAAALwAAADYSejunaGhlYQAABHwAAAAcAAAAJAfeA4VobXR4AAAEmAAAAA4AAAAQEAAAAGxvY2EAAASoAAAACgAAAAoCUAEabWF4cAAABLQAAAAfAAAAIAEWAIBuYW1lAAAE1AAAAUUAAAJtPlT+fXBvc3QAAAYcAAAANwAAAEtKBE4LeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkYWCcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGByelTznZW7438AQw9zAsAMozAiSAwDprAydeJztkMENgCAMRV8BDTGyiUfjQJ4cwIW5wBhYigeH8DevaX9+eigwAV7ZlAByIXSd6or5nsX8wKF71HJQ7pJrau07mcQS0a5KT8rMr9X6/m6+f21gcx70f9c0wD04Wha2eJx9ks9rE0EUx9/b2XmzO5v9ke5utmhtako2IpjadLM5SFM9KELFgughVQQPgl5U9OBB1ENvQuuPs+cWb0LAg9iC/gG5eSyB4sVL6c2DYXWStpqCdtj5zsz77nvD+zBAAL8usm/MAw/KMA2zsABXABqVuERBEQvqm6ml9SSqx1MYT6pgNK2C01ET67FPIAoQpdCIgVWx0sTGOEYOskoVHQzzwTimc9jEJBb16GdeBLZBGmMkpP1uPhWGWs3Zq5ybDi50sh0i9Dod9IiynU57W9e32wMd6fLRyODFkHXJsrbePjhKdkiWqqTbkj3BKCWyCzQ3hoi2dFi5nz9Ur/d0v5JS/LLEeM7l2Zael1xbYiMT7rNPN0GNYRYTkMBZuAQ3/sHCVxhUc4VoRkHIJzHro6k4uIumEdWa+H80Klfk1XYv9yCVDU/atuxL8S8fHXVpY27xEEKXXfWH6t2VjnPriLBDIdmAjo7XbZn92HXRlHZ2cjQlrk6haI5pag0sVj2Ml3bqYAHFyVCcvrP37A5YEMEJSOECXIPb8AiAD7fqoFAbdayiX4rryqqqxxCpWEB4erJSipP0DI6rp6LsWUzSmZpCHLhIlZiOYVCozWHaZyuGbOrbpTAKB26iXNxZ73HeW9/o68bqpq5vrq4NlAzt+V3izKSHLzQj+4wj3DB4QALFlOflPct85fuvTakxjbM3hOIl++o6jivNFR/9ZWkyRE1fIbGsFf5csN5j5/TNtf17svsGv7dWRGlxPP7hMTdwHg3L6M/sfOC1vYAWc2WrRV1k1CbGWrrOW1p3z7LKOWVp9FHbMwB+A6pmuAh4nGNgZGBgAOL3K6ZVx/PbfGXgZmEAgetrq/8i6P8eLAzMGUAuBwMTSBQAZacMEQB4nGNgZGBgbvjfwBDDwgACQJKRARWwAABHCgJteJxjYWBgYEHCAACwABEAAAAAAAAAhgEaAcoAAHicY2BkYGBgYShh4GAAASYg5gJCBob/YD4DABTCAZcAeJxlj01OwzAQhV/6B6QSqqhgh+QFYgEo/RGrblhUavdddN+mTpsqiSPHrdQDcB6OwAk4AtyAO/BIJ5s2lsffvHljTwDc4Acejt8t95E9XDI7cg0XuBeuU38QbpBfhJto41W4Rf1N2MczpsJtdGF5g9e4YvaEd2EPHXwI13CNT+E69S/hBvlbuIk7/Aq30PHqwj7mXle4jUcv9sdWL5xeqeVBxaHJIpM5v4KZXu+Sha3S6pxrW8QmU4OgX0lTnWlb3VPs10PnIhVZk6oJqzpJjMqt2erQBRvn8lGvF4kehCblWGP+tsYCjnEFhSUOjDFCGGSIyujoO1Vm9K+xQ8Jee1Y9zed0WxTU/3OFAQL0z1xTurLSeTpPgT1fG1J1dCtuy56UNJFezUkSskJe1rZUQuoBNmVXjhF6XNGJPyhnSP8ACVpuyAAAAHicY2BigAAuBuyAhZGJkZmRhZGVgS0pPy0xL529KjGvJDMvna8iM7EyMz0VTBWWMjAAAMVzC6AA') format('woff'), 6 | url('anime_music_icon.ttf?t=1535597309299') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ 7 | url('anime_music_icon.svg?t=1535597309299#iconfont') format('svg'); /* iOS 4.1- */ 8 | } 9 | 10 | .iconfont { 11 | font-family:"iconfont" !important; 12 | font-size:16px; 13 | font-style:normal; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | } 17 | 18 | .icon-play:before { content: "\e6e1"; } 19 | 20 | .icon-pause:before { content: "\e70d"; } 21 | 22 | .icon-next:before { content: "\e674"; } 23 | 24 | -------------------------------------------------------------------------------- /anime_music_icon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/anime_music_icon.eot -------------------------------------------------------------------------------- /anime_music_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | Created by iconfont 9 | 10 | 11 | 12 | 13 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /anime_music_icon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/anime_music_icon.ttf -------------------------------------------------------------------------------- /anime_music_icon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JxiaoC/animeMusic/14463b19529b7641fd858823606b833bf22e2967/anime_music_icon.woff -------------------------------------------------------------------------------- /demo.css: -------------------------------------------------------------------------------- 1 | 2 | body { 3 | margin: 0; 4 | } 5 | 6 | .bg { 7 | position: fixed; 8 | height: 100%; 9 | width: 100%; 10 | background-position: center center; 11 | } 12 | 13 | .bg img { 14 | position: absolute; 15 | top: 0; 16 | left: 0; 17 | min-width: 100%; 18 | min-height: 100%; 19 | transition: opacity 1s, transform 180s; 20 | opacity: 0; 21 | transform: scale(1.2,1.2); 22 | transition-timing-function: ease-out; 23 | } 24 | 25 | .bg img.show { 26 | opacity: 1; 27 | } 28 | 29 | .mask { 30 | position: fixed; 31 | height: 100%; 32 | width: 100%; 33 | background-color: rgba(0, 0, 0, 0.3); 34 | } 35 | 36 | .player { 37 | font-family: 微软雅黑; 38 | width: 300px; 39 | height: 154px; 40 | background-color: rgba(0, 0, 0, 0.3); 41 | position: fixed; 42 | left: 20px; 43 | bottom: 20px; 44 | background-size: 100% 100%; 45 | background-position: center center; 46 | overflow: hidden; 47 | } 48 | 49 | .player .logo { 50 | position: relative; 51 | width: 100%; 52 | height: 100%; 53 | } 54 | 55 | .player .logo img { 56 | position: absolute; 57 | top: 0; 58 | left: 0; 59 | width: 100%; 60 | height: 100%; 61 | transition: margin-top 1s; 62 | -moz-transition: margin-top 1s; 63 | -webkit-transition: margin-top 1s; 64 | -o-transition: margin-top 1s; 65 | margin-top: 100%; 66 | display: block; 67 | } 68 | 69 | .player .logo img.show { 70 | margin-top: 0px; 71 | } 72 | 73 | .player .control { 74 | position: absolute; 75 | top: 38%; 76 | left: 10px; 77 | font-size: 55px; 78 | color: #fff; 79 | text-shadow: 0px 0px 1px rgb(0, 0, 0); 80 | } 81 | 82 | .player .control:hover { 83 | text-shadow: 0px 0px 5px rgb(0, 0, 0); 84 | } 85 | 86 | .player .next { 87 | position: absolute; 88 | top: 55%; 89 | left: 65px; 90 | font-size: 35px; 91 | color: #fff; 92 | text-shadow: 0px 0px 1px rgb(0, 0, 0); 93 | } 94 | 95 | .player .next:hover { 96 | text-shadow: 0px 0px 5px rgb(0, 0, 0); 97 | } 98 | 99 | .player .name { 100 | position: absolute; 101 | bottom: 12px; 102 | left: 5px; 103 | text-shadow: 0px 0px 2px rgb(0, 0, 0); 104 | white-space: nowrap; 105 | color: #fff; 106 | cursor: default; 107 | } 108 | 109 | .player .progress { 110 | position: absolute; 111 | bottom: 0; 112 | left: 0; 113 | background-color: rgba(80, 168, 255, 0.6); 114 | height: 7px; 115 | width: 100%; 116 | cursor: pointer; 117 | } 118 | 119 | .player .progress .now { 120 | transition: width 0.3s; 121 | -moz-transition: width 0.3s; 122 | -webkit-transition: width 0.3s; 123 | -o-transition: width 0.3s; 124 | background-color: rgba(255, 255, 255, 0.8); 125 | height: 7px; 126 | width: 0px; 127 | } 128 | 129 | .player .time { 130 | color: #fff; 131 | font-size: 28px; 132 | position: absolute; 133 | top: 50%; 134 | text-shadow: 0px 0px 2px rgb(0, 0, 0); 135 | cursor: default; 136 | right: 20px; 137 | } 138 | 139 | .start { 140 | position: fixed; 141 | width: 100%; 142 | height: 100%; 143 | background: rgba(0, 0, 0, 0.4); 144 | z-index: 9; 145 | text-align: center; 146 | color: #fff; 147 | font-size: 50px; 148 | cursor: pointer; 149 | padding-top: 20%; 150 | } 151 | -------------------------------------------------------------------------------- /demo.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | demo 5 | 6 | 7 | 8 | 9 |
      10 |
      11 |
      Play()
      12 |
      13 | 14 |
      15 | 16 |
      00:00/00:00
      17 |
      18 |
      19 |
      20 |
      21 |
      22 | 23 | 24 | 118 | --------------------------------------------------------------------------------