feat: 支持直接下载脚本

This commit is contained in:
helloplhm-qwq 2023-12-23 17:27:29 +08:00
parent e71edf9e78
commit ed8650febd
No known key found for this signature in database
GPG Key ID: 6BE1B64B905567C7
4 changed files with 76 additions and 1 deletions

2
.gitignore vendored
View File

@ -35,3 +35,5 @@ config.json
*.un~ *.un~
*.un *.un
# temp script
lx-music-source-example.js

View File

@ -65,6 +65,8 @@ default = {
"_proxy-desc": "代理配置HTTP与HTTPS协议需分开配置", "_proxy-desc": "代理配置HTTP与HTTPS协议需分开配置",
"log_file": True, "log_file": True,
"_log_file-desc": "是否开启日志文件", "_log_file-desc": "是否开启日志文件",
"allow_download_script": True,
'_allow_download_script-desc': '是否允许直接从服务端下载脚本,开启后可以直接访问/script下载脚本',
}, },
"security": { "security": {
"rate_limit": { "rate_limit": {

67
common/lx_script.py Normal file
View File

@ -0,0 +1,67 @@
# ----------------------------------------
# - mode: python -
# - author: helloplhm-qwq -
# - name: lx.py -
# - project: lx-music-api-server -
# - license: MIT -
# ----------------------------------------
# This file is part of the "lx-music-api-server" project.
from . import Httpx
from . import config
from . import scheduler
from .variable import iscn
from .log import log
from aiohttp.web import Response
logger = log('lx_script')
async def get_response(retry = 0):
if (retry > 10):
raise Exception('请求源脚本内容失败')
baseurl = 'https://raw.githubusercontent.com/lxmusics/lx-music-api-server/main/lx-music-source-example.js'
try:
if (iscn and (retry % 2) == 0):
req = await Httpx.AsyncRequest('https://mirror.ghproxy.com/' + baseurl)
else:
req = await Httpx.AsyncRequest(baseurl)
except:
return await get_response(retry + 1)
return req
async def get_script():
req = await get_response()
if (req.status == 200):
with open('./lx-music-source-example.js', 'w') as f:
f.write(req.text)
f.close()
logger.info('更新源脚本成功')
else:
raise Exception('请求源脚本内容失败')
async def generate_script_response(request):
if (request.query.get('key') != config.read_config('security.key.value') and config.read_config('security.key.enable')):
return 'key验证失败'
try:
with open('./lx-music-source-example.js', 'r') as f:
script = f.read()
except:
return '本地无源脚本'
scriptLines = script.split('\n')
newScriptLines = []
for line in scriptLines:
line = line.strip()
if (line.startswith('const API_URL')):
newScriptLines.append(f'const API_URL = "{request.scheme}://{request.host}/"')
elif (line.startswith('const API_KEY')):
newScriptLines.append(f'const API_KEY = "{config.read_config("security.key.value")}"')
else:
newScriptLines.append(line)
return Response(text = '\n'.join(newScriptLines), content_type = 'text/javascript',
headers = {
'Content-Disposition': 'attachment; filename=lx-music-source.js'
})
if (config.read_config('common.allow_download_script')):
scheduler.append('update_script', get_script)

View File

@ -15,6 +15,7 @@ from common import log
from common import Httpx from common import Httpx
from common import variable from common import variable
from common import scheduler from common import scheduler
from common import lx_script
from aiohttp.web import Response from aiohttp.web import Response
import ujson as json import ujson as json
import threading import threading
@ -63,7 +64,7 @@ async def handle_before_request(app, handler):
config.updateRequestTime(request.remote_addr) config.updateRequestTime(request.remote_addr)
# check host # check host
if (config.read_config("security.allowed_host.enable")): if (config.read_config("security.allowed_host.enable")):
if request.remote_host.split(":")[0] not in config.read_config("security.allowed_host.list"): if request.host.split(":")[0] not in config.read_config("security.allowed_host.list"):
if config.read_config("security.allowed_host.blacklist.enable"): if config.read_config("security.allowed_host.blacklist.enable"):
config.ban_ip(request.remote_addr, int(config.read_config("security.allowed_host.blacklist.length"))) config.ban_ip(request.remote_addr, int(config.read_config("security.allowed_host.blacklist.length")))
return handleResult({'code': 6, 'msg': '未找到您所请求的资源', 'data': None}, 404) return handleResult({'code': 6, 'msg': '未找到您所请求的资源', 'data': None}, 404)
@ -117,6 +118,9 @@ app.router.add_get('/', main)
app.router.add_get('/{method}/{source}/{songId}/{quality}', handle) app.router.add_get('/{method}/{source}/{songId}/{quality}', handle)
app.router.add_get('/{method}/{source}/{songId}', handle) app.router.add_get('/{method}/{source}/{songId}', handle)
if (config.read_config('common.allow_download_script')):
app.router.add_get('/script', lx_script.generate_script_response)
# 404 # 404
app.router.add_route('*', '/{tail:.*}', handle_404) app.router.add_route('*', '/{tail:.*}', handle_404)